看了前面一篇委託的用法中http://www.php.cn/,我們看到,
public void Description(string programerName, DescriptionDelegate description) { description(programerName); }
這個方法時傳一個DescriptionDelegate description委託類型進來,那麼對於這個方法再做一下修改,能用起來方便一些,程式碼也更合理一些。把委託封裝起來,然後把不同語言的程式設計師描述方法提出來:
封裝:
public class ProgramDescriptionDelegate2 { public delegate void DescriptionDelegate(string programerName); public DescriptionDelegate myDelegate; public void Description(string programerName) { myDelegate(programerName); } }
提出的類別:
public class TestDescriptionDelegate2 { 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语言编程!", programerName)); } public void Test() { ProgramDescriptionDelegate2 pe = new ProgramDescriptionDelegate2(); pe.myDelegate = CsharpProgramer; pe.myDelegate += CProgramer; pe.Description("SamYang"); } }
這樣就比較合理一些,因為public void CsharpProgramer(string programerName)這些方法,應該是用戶可以隨時定義的,可以看做隨時變動的。而ProgramDescriptionDelegate2完全作為一個公共的類,它只負責執行綁定在委託上的方法。
呼叫:
TestDescriptionDelegate2 t = new TestDescriptionDelegate2(); t.Test();
輸出:
再回過來看ProgramDescriptionDelegate2類,public DescriptionDelegate myDelegate;應該是一個字段,根據面向對象的封裝性,字段要封裝為屬性。那麼在這裡封裝我們要使用一個很有用的字段event。
封裝如下:
public class ProgramerDescriptionEvent { public delegate void DescriptionDelegate(string programerName); private event DescriptionDelegate myEvent; public event DescriptionDelegate MyEvent { add { this.myEvent += value; } remove { this.myEvent -= value; } } public void Description(string programerName) { myEvent(programerName); } }
public class TestEvent { 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语言编程!", programerName)); } public void Test() { ProgramerDescriptionEvent pe = new ProgramerDescriptionEvent(); pe.MyEvent += CsharpProgramer; pe.MyEvent += JavaProgramer; pe.Description("SamYang");//一般这个执行是放在引起事件执行的地方 } }
調用:
TestEvent te = new TestEvent(); te.Test();
結果如下:
可以看出,什麼是事件,其實本質使用的是委託,但是使用了event是這種委託變成了一種機制,叫事件。
那麼看msdn對委託和事件的描述:
事件是物件發送訊息,以發訊號通知操作的發生,操作可能是由使用者互動(滑鼠、鍵盤操作等)引起的,或是由某些其他的程式邏輯觸發。捕捉事件並對其作出回應的物件叫做事件接收方。
在事件通訊中,事件發送方類別不知道哪個物件或方法會接收到它引發的事件。所需要的是在來源和接收方之間存在一個媒介。 .NET Framework 定義了一個特殊的型別 (Delegate),該型別提供函數指標的功能。委託是可保存對方法的參考的類別。與其他的類別不同,委託類別具有一個簽名,並且它只能對與其簽名匹配的方法進行引用。這樣,委託就等效於一個型別安全函數指標或一個回呼。雖然委託具有許多其他的用途,但這裡只討論委託的事件處理功能。一個委託聲明足以定義一個委託類別。聲明提供委託的簽名,公共語言運行庫提供實作。例如:
public delegate void AlarmEventHandler(object sender, AlarmEventArgs e);
delegate 關鍵字通知編譯器 AlarmEventHandler 是一個委託類型。依照約定,.NET Framework 中的事件委託有兩個參數:引發事件的來源和該事件的資料。即sender和e。
以上就是C#基礎知識整理 基礎知識(21) 委託(二)的內容,更多相關內容請關注PHP中文網(www.php.cn)!