对于委托的初步认识

                                              

委托的定义:

委托是一种引用方法的类型,一旦为委托分配了方法,委托将与该方法具有相同的行为,委托方法的使用和其他方法一样,具有参数和返回值

通俗的讲:将方法作为方法的参数

注意:.委托定义的时候和类位于同一个级别。

2委托的定义语法:访问修饰符(public、private和protected等)delegate  方法签名(方法的名字,没有方法体);

 

方法签名:指定的是方法名称和参数,不包含返回值类型

 

eg.  public delegate int AddMethod(int x,int y);//该委托的返回值类型为int,但是,一般情况下 最好定义为viod

3.

3.使用委托实现各个国家人的问好功能来看怎样使用委托。

 

  使用委托分为三个步骤:1,定义委托  2.声明委托变量  3.使用委托

 

重点:委托有多种调用方式,无论使用哪种方式,最终都会创建出一个委托对象(查看源码)。

 

 

namespace chp201委托初步 { 

 //01.定义一个委托

      public delegate void FirstDel(string name);   //可以在不带参数或参数列表的情况下声明委托

  class Program   

{      

    static void Main(string[] args)       

{        

    //002.声明一个委托变量       

     FirstDel mydel = Chinese;       

     mydel("李小龙");    

//注意:第一次用的“=”,是赋值的语法;第二次,用的是“+=”,是绑定的语法。如果第一次就使用“+=”,将出现“使用了未赋值的局部变量”的编译错误。   

//但是代码可以这样写:

//GreetingDelegate delegate1 = new GreetingDelegate(); //delegate1 += EnglishGreeting;   // 这次用的是 “+=”,绑定语法。 //delegate1 += ChineseGreeting;   // 给此委托变量再绑定一个方法

     

  mydel += English;          

//既然给委托可以绑定一个方法,那么也应该有办法取消对方法的绑定,很容易想到,这个语法是“-=”:     

      mydel -= Chinese;   

 

  //003.调用委托                 

     mydel("JENG");          

  Console.ReadKey();     

   }       

static void Chinese(string myname)   

     {     

        Console.WriteLine("你好"+myname);

      

}    

    static void English(string aa)  

      {         

     Console.WriteLine(aa + ",Good morning.");  

      }

 

    }

输出的结果是

你好李小龙

JENG,Good morning

由此我们可以总结:1委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。

2.使用委托可以将多个方法绑定到同一个委托变量,当调用此变量时(这里用“调用”这个词,是因为此变量代表一个方法),可以依次调用所有绑定的方法。

另外:我们要知道自定的委托时继承多播委托,多播委托继承与委托

多播委托的概念:委托也可以包含多个方法。

如果调用多播委托,就可以按顺序连续调用多个方法。为此,委托的签名就必须返回 void (否则,返回值应送到何处?否则会抛出run-time exception)(当委托只包含一个方法的时候,其返回类型的声明可以参照所封装的方法,不一定必须是void)。实际上,如果编译器发现某个委托返回 void ,就会自动假定这是一个多播委托。

多播委托的缺点:当你已经挂载多个方法时,当你后面出现另一个方法挂载,用=,而不是+=时,前面加载的所有方法链全部断裂,只保留你最后挂载的方法。所以后来才有了事件。(注意:事件是一个私有的委托加上公有的Add()和Remove()方法,通俗的说,事件是对委托的封装,事件的作用只是为了约束一个委托对象的操作方法,对外通过+=进行挂载,-=进行取消挂载,不能通过=挂载,否则报错)。

补充知识:事件的定义方式:public event 委托的定义类型  事件名;

上面所写的各国人打招呼就是一个多播委托。

委托的优点: (1)压缩方法的调用。

(2)合理有效地使用委托能提升应用程序的性能。

(3)用于调用匿名方法。

说道这里我们提一下匿名类:匿名方法没有名称,编译器会定指定一个名称,匿名方法中不能使用跳转语句跳转到该匿名方法的外部,也不能跳转到该方法的内部。也不能在匿名方法外部使用的ref和out参数。

匿名方法的作用:因此减少了实例化委托所需的编码系统开销。

什么时候该使用匿名方法

1.需要一个临时方法,该方法使用次数极少;

2.这个方法的代码很短,甚至可能比方法声明都短的情况下使用。

匿名方法的特点: 1、  匿名方法只存在方法,但没有名字

2、  委托有一种桥接的概念,而匿名方法就是要将这个桥接简化。换句话说:匿名方法允许我们以一种“内联”的方式来编写方法代码,将代码直接与委托实例相关联,从而使得委托实例化的工作更加直观和方便

3、  匿名方法直接与委托实例相关联

匿名方法的定义

  MyDel del = delegate() { 方法体 };//  MyDel是定义的委托名称 

看如下代码:

1、  参数列表,看如下代码:

static void Main(string[] args)

{

     MyDelegate MyDele = delegate(int i) { Console.WriteLine("hello KiddLee"); };

}

delegate void MyDelegate(int i);

    匿名方法可以在delegate关键字后跟一个参数列表(可以不指定),后面的代码块则可以访问这些参数,如果不指定的话也是可以的,如下代码编译时也可以通过。

static void Main(string[] args)

{

     MyDelegate MyDele = delegate{ Console.WriteLine("hello KiddLee"); };

}

delegate void MyDelegate(int i);

    注意:不指定参数列表和参数列表为空是不一样的,如下

    //不指定参数列表,对于MyDelegate来说这种情况是正确的

    MyDelegate MyDele = delegate{ Console.WriteLine("hello KiddLee"); };

    //参数列表为空,对于MyDelegate来说这种情况是错误的

    MyDelegate MyDele = delegate(){ Console.WriteLine("hello KiddLee"); };

2、  匿名方法的返回值

如果委托类型的返回值类型为void,匿名方法里不能返回任何值

delegate void MyDelegate();

 

        static void Main(string[] args)

        {

            MyDelegate mydele = delegate

            {

                return;

            };

    }

但是如果委托类型的返回值类型不为void,匿名方法返回值也不能为void

delegate int MyDelegate();

 

        static void Main(string[] args)

        {

            MyDelegate mydele = delegate

            {

                return 100;

            };

    }

以上是我对于匿名类和委托的浅理解。请各位大神有更好的,可以指导指导我,谢谢

转载于:https://www.cnblogs.com/Bend215165709/p/3639391.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值