看了前面一篇委託的用法中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) 委託(二)的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!