C#代表元及事件觸發(Love.NET原創)
2024-07-10 13:00:27
供稿:網友
代表元是c#中比較復雜的概念,c#中的代表元和c/c++中的函數指針非常相似使用代表元可以把代表元內部方法的引用封裝起來然后通過它使用代表元引用的方法。
它有一個特性就是不需要知道被引用的方法屬于那一個類對象只要函數的參數個數與返回類型與代表元對象一致。這樣說可能比較抽象我下面舉幾個簡單的例子希望能給廣大初學者一些基本的認識
//定義一個返回值為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);
}
}