//定義一個返回值為string的無參數的代表元注意這個代表元只能引用對象中返回值為string的無參數方法 delegate string MyDelegate(); public class MyClass { public string SayHello() { return "Hello the world!"; }
} public class TestMyClass { public static void Main(string[] args) { MyClass myClass1=new MyClass(); MyDelegate myDelegate1=new MyDelegate(myClass1.SayHello); //下面就使用myDelegate1代替對象myClass1的SayHello方法 System.Console.WriteLine(myDelegate1()); //輸出結果為hello the world! 與調用myClass1.SayHello();效果相同 } } 如果代表元只有這點功能它就沒有什麼太大的用處了,代表元還有一個非常有用的功能就是定義復合代表元對象只有同樣類型的代表元才能夠復合起來 + 能定義復合代表元對象 - 從一個復合代表元中去掉一個代表元對象 delegate void MyDelegate(string s); public class MyClass { public void SayHello(string who) { System.Console.WriteLine( who+"hello!"); } public void SayGoodBye(string who) { System.Console.WriteLine( who+"good bye!"); }
}
public class TestMyClass { public static void Main(string[] args) { MyClass myClass1=new MyClass(); MyDelegate myDelegate,myDelegate1; myDelegate=new MyDelegate(myClass1.SayHello); myDelegate1=new MyDelegate(myClass1.SayGoodBye); myDelegate+=myDelegate1; //這樣調用myDeletage就相當於同時調用了myClass1.SayHello和myClass1.SayGoodBye myDelegate("love.Net "); //執行結果輸出love.net hello! love.Net good bye! } } 事件驅動是Windows應用程序的重要特征 C#代表元就是用於產生事件,事件就是用於在一個組件中監聽這個組件的變化 下面再舉一個簡單的例子 //定義一個事件代理(代表元) public delegate void EventHandler(string str); //定義事件源類 class EventSource { //定義代表元作為事件源類的成員 public event EventHandler Say; public void TriggerEvent() { if(this.Say!=null) //因為Say是個代表元所以執行Say方法所做的實際操作由注冊到它的事件處理函數決定 Say("A event take place!"); } } //測試 class Test { public static void Main() { EventSource aEventSource=new EventSource(); //注冊事件處理函數為MyEvent 顯示一串字符類似於this.Click+=new EventHandler(Button1_OnClick); aEventSource.Say+=new EventHandler(MyEvent); //此處為演示事件觸發過程所以就用程序自動觸發 //在圖形界面應用程序中,一般由用戶觸發事件,後由操作系統發送消息並調用處理函數 所以程序員只要注冊事件處理函數 //和編寫事件處理函數的代碼其他就不用關心了 aEventSource.TriggerEvent(); } //事件處理函數 public static void MyEvent(string str) { System.Console.WriteLine(str); }