委托与事件

委托和事件在.Net Framework中的应用非常广泛,属于.net中的高级特性,但理解起来可能要花点时间,正因为这,委托与事件在面试或者笔试题目经常会有看到。.NET中的委托与C++中的函数指针很相似,也有人称委托为“安全的函数指针”,它不仅仅能把地址指向另一个函数,而且还能传递参数,返回值等多个信息。

   1.委托的官方解释:

    delegate 是表示对具有特定参数列表和返回类型的方法的引用的类型。在实例化委托时,你可以将其实例与任何具有兼容签名和返回类型的方法相关联。你可以通过委托实例调用方法。

  2.通俗点的解释:

  常用的表达,方法的参数可以是int型 、string、或者 类传递

  void M1(int n)

  void M2(string s)

  void M3(Person p)

但委托作为一种数据类型来使用,让方法当做变量来传递,委托的好处就是减少代码量,也就是优化

void M4(M1 method)
  {
     method();
  }
static void Main(string[] args)
 {
 ClassLibrary1.Class1 c1 = new ClassLibrary1.Class1();
 c1.Do(M1);
 Console.Read();
 }

 //使用者自己定义一个方法M1()作为method方法通过委托传入Do()引用之中
 static void M1()
 {
 Console.WriteLine("当前时间:{0}", DateTime.Now);
 }

3.匿名方法与Lambda 表达式

在2.0之前的C#版本中,声明委托的唯一方法是使用命名方法。C#2.0引入了匿名方法,而在C#3.0及更高版本中,Lambda表达式取代了匿名方法,作为编写内联代码的首选方式。

//带两个参数,带一个返回值的委托的Lambda表达式写法

static void Main(string[] args)
 {
   Delegate3 md = (x, y) => x + y; //λ表达式
   int r = md(100, 200);
   Console.WriteLine(r);
   Console.Read();
 }
 public delegate int Delegate3(int n, int m);

4.多播委托

每个委托都只包含一个方法调用,调用委托的次数与调用方法的次数相同。如果调用多个方法,就需要多次显示调用这个委托。当然委托也可以包含多个方法,这种委托称为多播委托。

一个委托变量同时指向了多个方法,就是多播委托

namespace 多播委托
  class program{
  static void Main(string[] args)
        {
            Delegate1 md = M1;
            md += M2;
            md += M3; //如果使用等号为委托赋值,最后会将前面的所有的绑定的委托都覆盖掉。
            md();//当调用委托变量的时候,绑定到该委托上的所有方法都会被执行。
            Console.Read();
        }
        static void M1()
        {
            Console.WriteLine("M1");
        }
        static void M2()
        {
            Console.WriteLine("M2");
        }
        static void M3()
        {
            Console.WriteLine("M3");
        }
}

 //定义一个委托
 public delegate void Delegate1();
}

5.事件

官方解释:.NET Framework 中的事件是基于委托模型的。 委托模式遵守观察者设计模式使订阅者能够向提供程序注册并接收相关通知。 事件发送方推送通知事件发生,事件接收器接收该通知并定义给它的响应。

通俗点的描述:

1.事件的主要作用与委托是一样的,只是功能上比委托变量有更多的限制。1.只能通过+=或-=来绑定方法(事件处理程序) 2.只能在类内部调用(触发)事件。)

2.在自定义控件(自己编写控件的时候,会大量用到.编写控件的时候,会写一些事件。 但是当这些事件 被触发以后,具体执行的那些事件处理程序是编写控件的人没法确定的。这个时候只能通过事件来占位(调用),具体调用的是哪个方法,由使用控件的人来决定(Click+=new 委托(方法名);))

3.委托与事件没有可比性,委托是数据类型,事件是对象(理解为对委托的封装),事件是动作。

4.事件的三种方式:1.直接用委托实现 2.用私有委托+公有方法模拟事件 3.直接用event事件实现。

Written by

说点什么

欢迎讨论

avatar

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

  Subscribe  
提醒