首页 > 代码库 > 解构委托、事件--我对他们本质的理解
解构委托、事件--我对他们本质的理解
一、委托
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_委托名(委托)方法来移除。
所以,声明一个事件,实际上是新建一个封装好的多播委托。
解构委托、事件--我对他们本质的理解
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。