委託和事件在C#中使用很多,尤其在進行表單編程時,很多的操作都要通過委託和事件來處理和傳遞。這裡詳細解釋下委託和事件的用法和原因,使我們在寫代碼時能更加明白一些。
委託的使用
事件是一種機制,事件是通過委託實現的,所以看明白了委託,對於事件也就能更好的理解了。先看下面一個小例子。
這是描述不同語言的程式員的代碼:
比如使用C#的程式員我們這樣描述,其中programerName參數表示這個程式員的姓名。
public void CsharpProgramer(string programerName) { Console.WriteLine(string.Format("{0} 使用C#編程!", programerName)); }
使用Java的,
public void JavaProgramer(string programerName) { Console.WriteLine(string.Format("{0} 使用Java語言編程!")); }
那麼這麼多語言,怎麼區分這是哪個程式員呢?使用一個枚舉來表示,
public enum ProgramLanguage { CSharp, C, Java }
那麼進行一個完整的描述,代碼如下:
public class ProgramerDescription { //01 public void CsharpProgramer(string programerName) { Console.WriteLine(string.Format("{0} 使用C#編程!", programerName)); } public void CProgramer(string programerName) { Console.WriteLine(string.Format("{0}使用C語言編程!", programerName)); } public void JavaProgramer(string programerName) { Console.WriteLine(string.Format("{0} 使用Java語言編程!")); } //02 public void Description(string programerName, ProgramLanguage type) { switch (type) { case ProgramLanguage.CSharp: CsharpProgramer(programerName); break; case ProgramLanguage.C: CProgramer(programerName); break; case ProgramLanguage.Java: JavaProgramer(programerName); break; default: Console.WriteLine("A kind of new Language that you never heard of."); break; } } } public enum ProgramLanguage { CSharp, C, Java }
調用:
ProgramerDescription pm = new ProgramerDescription(); pm.Description("楊友山", ProgramLanguage.CSharp);
這時,輸出"楊友山 使用C#編程!";
這樣就初步完成了一個對程式員描述的簡單實現。這裡的Description方法是通過一個枚舉類型來區別不同的語言。這樣它的維護性是比較差的,因為還有很多程式設計語言(C++,php,等),如果想加一種語言就要增加一個對應的方法,然後就要修改ProgramLanguage這個枚舉類型。增加方法對原程式影響不大,因為可以用部分類別來實現,而修改枚舉就不合適了,這也不符合物件導向設計思想的開放封閉原則。
那麼在Description方法中怎麼處理呢,也就是不用枚舉了,Description方法如何來區分該調用哪個方法(CsharpProgramer,CProgramer,JavaProgramer)對程式員進行描述。
public void Description(string programerName, 某類型 某參數)
{
//調用對應的方法
}
這裡的某類型就是要用它來區別哪個方法的類型,換句話說,最好就是在這裡我直接把我想要調用的方法當做參數傳進去。比如我要調用CProgramer方法來描述C程式員,
ProgramerDescription pm = new ProgramerDescription();
pm.Description("D.M.Ritchie", CProgramer);
按照這個想法,public string Description(string programerName, 某類型 某參數)的“某類型 某參數”該怎麼表示呢?
當然我們就想到C#中的委託delegate了。委託是一種資料結構,它引用靜態方法或引用類執行個體及該類的執行個體方法。 用委託來完成上述的代碼:
public class ProgramDescriptionDelegate { //委託,表示方法 public delegate void DescriptionDelegate(string programerName); //01 public void CsharpProgramer(string programerName) { Console.WriteLine(string.Format("{0} 使用C#編程!", programerName)); } public void CProgramer(string programerName) { Console.WriteLine(string.Format("{0}使用C語言編程!", programerName)); } public void JavaProgramer(string programerName) { Console.WriteLine(string.Format("{0} 使用Java語言編程!")); } //02 public void Description(string programerName, DescriptionDelegate description) { description(programerName); } }
調用:
ProgramDescriptionDelegate pm = new ProgramDescriptionDelegate(); pm.Description("楊友山", pm.CsharpProgramer);
結果是和最開始的代碼是一樣的。
什麼是委託?MSDN這樣解釋的:委託是一種定義方法簽名的類型,可以與具有相容簽名的任何方法關聯,可以通過委託調用方法。委託用於將方法作為參數傳遞給其他方法。時間處理常式就是通過委託調用的方法。
仔細看使用委託的代碼,
public void Description(string programerName, DescriptionDelegate description)。調用時,
DescriptionDelegate description傳入的是 pm.CsharpProgramer,也就是此時description=pm.CsharpProgramer。其實我們還可以這樣調用:
//方法和委託綁定 ProgramDescriptionDelegate pm = new ProgramDescriptionDelegate(); YYS.CSharpStudy.Window.SDelegate.ProgramDescriptionDelegate.DescriptionDelegate csharpDelegate = pm.CsharpProgramer; YYS.CSharpStudy.Window.SDelegate.ProgramDescriptionDelegate.DescriptionDelegate cdelegate = pm.CProgramer; pm.Description("楊友山", csharpDelegate); pm.Description("D.M.Ritchie", cdelegate);
結果:
再做修改:
ProgramDescriptionDelegate pm = new ProgramDescriptionDelegate(); YYS.CSharpStudy.Window.SDelegate.ProgramDescriptionDelegate.DescriptionDelegate pdelegate = null; pdelegate += pm.CsharpProgramer; pdelegate += pm.CProgramer; pm.Description("楊友山", pdelegate);
結果:
這裡先執行了pm.CsharpProgramer,然後又執行了pm.CProgramer方法。
可以看出委託不光可以將方法作為參數,而且還可以將方法綁定,而起還可以綁定多個。
使用+=Binder 方法,取消則使用-=進行取消,上面的調用可以修改如下:
ProgramDescriptionDelegate pm = new ProgramDescriptionDelegate(); YYS.CSharpStudy.Window.SDelegate.ProgramDescriptionDelegate.DescriptionDelegate pdelegate = null; pdelegate += pm.CsharpProgramer; pdelegate += pm.CProgramer; pdelegate -= pm.CProgramer; pm.Description("楊友山", pdelegate);
這樣就只調用pm.CsharpProgramer;一個方法了。
以上就是C#基礎知識整理 基礎知識(20) 委託(一)的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!