委托和事件的区别
前言:在我们学习完委托和事件了,那我们需要想一想委托和事件到底有什么区别呢?如果不了解委托和事件的话请看我之前的博客.http://www.cnblogs.com/MoRanQianXiao/p/7767931.html%20和http://www.cnblogs.com/MoRanQianXiao/p/7773911.html。
首先我们先建立一个学习类,声明委托和事件。在这个类中有两个学习的方法。在构造函数中进行委托和事件的注册。并且写一个方法进行委托和事件的调用,我们在下面的类中委托和事件的注册和调用都没有什么区别。代码如下:
/// <summary> /// 学习类 /// </summary> public class Learn { //委托 public Action actHandle; //事件 public event Action eveEvent; /// <summary> /// 构造函数 /// </summary> public Learn() { //委托的注册 actHandle += Test1; actHandle += Test2; //事件的注册 eveEvent += Test1; eveEvent += Test2; } public void Test1() { Console.WriteLine("Test1"); } public void Test2() { Console.WriteLine("Test2"); } /// <summary> /// 方法的调用 没有明显的区别 /// </summary> public void CallMethod() { actHandle?.Invoke(); eveEvent?.Invoke(); } }
在下面的代码中,当我们在一个方法中进行委托的声明,而我们在方法的内部是不能声明局部的实例的。而且我们在下面的方法中当我们为一个方法传递参数的时候,我们可以把委托当作一个方法的参数来进行使用,而我们的事件不可以。
/// <summary> /// 学习类 /// </summary> public class Learn2 { public void CallMathod2() { //定义委托的局部实例 Action actHandle2 = Test1; actHandle2 += Test2; //视图定义事件局部实例??????------这是错误的!!!! //测试 actHandle2.Invoke(); } public void Test1() { Console.WriteLine("Test1"); } public void Test2() { Console.WriteLine("Test2"); } /// <summary> /// 把委托当作为一个方法的参数来使用 /// </summary> /// <param name="actHandle"></param> public void Test3(Action actHandle) { actHandle?.Invoke(); } }
总结:
1.委托可以声明为局部的变量,而事件只能作为类的一个成员(即字段)来使用。所以我们可以认为事件是委托的一个特殊的实例,即受限制的委托,不可以定义局部的事件实例(语法错误)。
2.委托可以作为方法的参数使用,而事件不可以。