首页 > 代码库 > 解构委托、事件--我对他们本质的理解

解构委托、事件--我对他们本质的理解

一、委托
1、因为委托是一个特殊的类,所以定义委托和定义类一样,可以在命名空间下定义;
namespace _06委托的理解
{
    public delegate void MyDeleget();//第一一个委托
 
    public class MyClass { };//第一个类
}

  

2、委托可以看成是一个特殊的集合,所以委托也可以在类的内部定义:
 
public class MyClass2
{
    public delegate void MyDelegat2();//委托也可以定义在类的内部
}

  

但是在类内部定义的委托,就专属于这个内,其他类不能直接声明这个委托。
3、委托的参数只能是方法。在声明的一个新的委托时,因为委托是一个特殊的类,而委托的构造函数需要一个参数以供初始化用。如果委托是一个字段,因为字段的位置不能获取方法名,所以字段位置无法直接初始化一个委托,而必须在方法内部完成初始化。
public class MyClass3
{
    public MyClass myClass = new MyClass();
    public MyDelegate1 myDelegate1 = new MyDelegate1();//错误 CS1729 “MyDelegate1”不包含采用 0 个参数的构造函数  
    public void MyMethod3()
    {           
        myDelegate1 = new MyDelegate1(myClass.MyMethod);//必须在方法内实例化,实例化时至少传入一个方法,方法不能带(),因为在C#里()表示立即运行,而这时候我们并不需要立即运行   
    }            
}

  

4、委托的实质是一个类型安全的指针。可以避免在方法内直接调用另一个方法导致的可能出现的安全问题,而且提高了程序可扩展性。(这来自教科书,可以结合引用类型的特征来理解)
5、调用委托
调用委托,只要直接按  委托名();
需要注意的是,如果是多播委托(传入了多个方法),那这样运行会按传入的方法的先后逐个运行所有方法。
二、事件
事件的本质是编译器对委托的进行一个简单的封装。 
当我们为事件传递方法时,将调用一个隐藏的方法 add_委托名(委托) 来添加这个方法。移除时则调用一个隐藏的 remove_委托名(委托)方法来移除。
所以,声明一个事件,实际上是新建一个封装好的多播委托。

解构委托、事件--我对他们本质的理解