解構委托、事件--我對他們本質的理解
阿新 • • 發佈:2017-06-08
remove 類型 實例化 如果 方法 擴展 調用 所有 csharp 一、委托
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_委托名(委托)方法來移除。 所以,聲明一個事件,實際上是新建一個封裝好的多播委托。
解構委托、事件--我對他們本質的理解