• 委托


    匿名类是没有名字的类。特点:匿名类不能被引用,只能在创建时用new语句来声明。

    一.委托的概念

        委托是用户自定义的类,它定义了方法的类型。储存的是一系列具有相同参数和返回类型方法的地址列表,调用委托时,此委托列表的所有方法都将被执行。

    二.委托类型的定义

    委托类型必须在被用来创建变量以及类型对象之前声明。

    委托类型的声明:

    1.以delegate关键字开头。

    2.返回类型+委托类型名+参数列表

    在C#中使用一个类分为两个阶段。
    首先,定义这个类,告诉编译器这个类是由什么字段和方法组成的。
    然后,使用这个类实例化对象。
    在使用委托的过程中,也需要经历着两个阶段。
    首先,定义委托,告诉编译器这个委托可以指向哪些类型的方法,然后,创建该委托的实例。

     1         //定义一个 无返回值的 无参数的委托
     2         public delegate void ShowDelegate();
     3         //定义一个 无返回值的 有参数的 委托
     4         public delegate void Show2Delegate(string msg);
     5         //定义一个 有返回值的 有参数的 委托
     6         public delegate string Show3Delegate(string msg);
     7         //定义一个用来测试多播委托的 委托
     8         public delegate void PrintLogDelegate(string log);
     9         public DelegateTest()
    10         {
    11             Console.WriteLine("=====委托的第一种赋值方式  new=====");
    12             ShowDelegate ds = new ShowDelegate(Show);
    13             ds();//委托的第一种调用方式
    14             ds.Invoke();//委托的第2种调用方式
    15             Console.WriteLine("=====委托的第2种赋值方式  直接赋值=====");
    16             Show2Delegate ds_2 = Show2;
    17             ds_2.Invoke("委托的赋值  直接赋值");//显示调用
    18             Console.WriteLine("=====委托的第3种赋值方式  匿名方法=====");
    19             Show2Delegate sd_3 = (msg) =>
    20             {
    21                 Console.WriteLine(msg);
    22             };
    23             sd_3.Invoke("委托的赋值  匿名方法");
    24             Console.WriteLine("=====委托的第4种赋值方式  委托变量声明之后使用+=、-=    =====");
    25             Show2Delegate sd_4 = null;
    26             sd_4 += Show2;
    27             sd_4 += (msg) => { Console.WriteLine("匿名方法赋值:"+msg); };
    28             sd_4.Invoke("委托变量声明之后使用+=、-= ");
    29 
    30 
    31             Console.WriteLine();
    32             Console.WriteLine();
    33             Console.WriteLine();
    34             Show2Delegate ds2 = new Show2Delegate(Show2);
    35             ds2("这是一个有参数的委托");
    36             ds2("委托的隐式调用");
    37             ds2.Invoke("委托的显示调用");
    38             Console.WriteLine("====调用有返回值 有参数的委托========");
    39             Show3Delegate sd3 = new Show3Delegate(Show3);
    40             //接收委托的返回值
    41             string str =  sd3.Invoke("这是有返回值 有参数的委托的测试");
    42             Console.WriteLine(str);
    43 
    44             Console.WriteLine("==============多播委托====================");
    45             PrintLogDelegate printLog = null;
    46             printLog += Print1;
    47             printLog += Print2;
    48             printLog += Print3;
    49             //调用
    50             printLog.Invoke("多播委托的测试");
    51 
    52             printLog -= Print3;
    53             printLog.Invoke("多播委托的测试_去掉一个方法");
    54 
    55 
    56             Console.ReadKey();
    57 
    58         }
    59 
    60 
    61         public void Print1(string log)
    62         {
    63             Console.WriteLine("Print1:" + log);
    64         }
    65         public void Print2(string log)
    66         {
    67             Console.WriteLine("Print2:" + log);
    68         }
    69         public void Print3(string log)
    70         {
    71             Console.WriteLine("Print3:" + log);
    72         }
    73         public void Show()
    74         {
    75             Console.WriteLine("我是具体的方法实现");
    76         }
    77         public void Show2(string msg)
    78         {
    79             Console.WriteLine("Show2:" + msg);
    80         }
    81 
    82         public string Show3(string msg)
    83         {
    84             return "返回:" + msg;
    85         }
    86     }
    87 }
  • 相关阅读:
    随笔1
    模块
    文件输入流
    一次javaweb登陆实验
    s7八进4
    jdbc连接数据库
    自己找茬
    用栈来求解汉诺塔问题
    用一个栈实现另一个栈的排序
    猫狗队列
  • 原文地址:https://www.cnblogs.com/lujingBK/p/11172459.html
Copyright © 2020-2023  润新知