.Net (C#)委托和事件(获取多个返回值)
From:?http://www.xuebuyuan.com/841530.html
在講如何獲取多個返回值之前先來看一個小例子:
?
??????? private void button1_Click(object sender, EventArgs e)
??????? {
??????????? int Number = 200;???????? //設置Number的值為 200。
??????????? Publishser pub = new Publishser();?????//實例化Publishser
??????????? Subscriber1 sub1 = new Subscriber1();?????//實例化Subscriber1
??????????? Subscriber2 sub2 = new Subscriber2();?????//實例化Subscriber2
??????????? Subscriber3 sub3=new Subscriber3();???????//實例化Subscriber3
??????????? pub.NumberChanged += sub1.OnNumberChanged;???//將方法綁定到委托
??????????? pub.NumberChanged += sub2.OnNumberChanged;
??????????? pub.NumberChanged += sub3.OnNumberChanged;
??????????? pub.DoComething(Number);??????//調用DoComething
??????? }
??? class Publishser
??? {
??????? public delegate int DemoEventHandler(int num);??????//定義委托,可代表的方法類型是整形
??????? public event DemoEventHandler NumberChanged;??//申明事件
??????? public void DoComething(int temp)
??????? {
??????????? if (NumberChanged != null)
??????????? {
??????????????? ?temp=NumberChanged(temp);
??????????? }
??????????? MessageBox.Show(temp.ToString());
??????? }
??? }
??? class Subscriber1
??? {
??????? public int OnNumberChanged(int num)
??????? {
??????????? MessageBox.Show("調用了Subscriber1類,num值為:"+ num);
??????????? return num + 100; ;
??????? }
??? }
??? class Subscriber2
??? {
??????? public int OnNumberChanged(int num)
??????? {
??????????? MessageBox.Show("調用了Subscriber2類 num值為:"+num);
??????????? return num+100;
??????? }
??? }
??? class Subscriber3
??? {
??????? public int OnNumberChanged(int num)
??????? {
??????????? MessageBox.Show("調用了Subcriber3類,num值為:"+num);
??????????? return num+100;
??????? }
??? }
?
?
?
?我以為得到的結果是:
????????????????????????????? 調用了Subscriber1類,num值為:200
????????????????????????????? 調用了Subscriber2類,num值為:300
????????????????????????????? 調用了Subscriber3類,num值為:400
????????????????????????????? 500
但是程序運行完之后結果卻不是我所想的,結果是:
??????????????????????????????????????????????????????????????????? 調用了Subscriber1類,num值為:200
??????????????????????????????????????????????????????????????????? 調用了Subscriber2類,num值為:200
??????????????????????????????????????????????????????????????????? 調用了Subscriber3類,num值為:200
????????????????????????????????????????????????????????????????????300
發現問題之后我用逐語句運行的方式調試程序,我發現當NumberChanged != null 第一次調用了Subscriber1之后并沒有返回到Publishser類,也沒有執行Subscriber1的 return,而是直接調用了Subscriber2,temp的值依舊是剛開始的200。執行完之后調用Subscriber3,只有當Subscriber3執行完了之后才返回到Publishser 這個時候temp的值等于300。(現在我也不知道為什么會這樣,但是我在網上學習了一種可以獲取多個返回值的方法!)
---------------------------------------------------------------------------------------------------------------------------------------
獲取多個返回值:
?
??????? private void button1_Click(object sender, EventArgs e)
??????? {
??????????? int Number = 200;
??????????? Publishser pub = new Publishser();
??????????? Subscriber1 sub1 = new Subscriber1();
??????????? Subscriber2 sub2 = new Subscriber2();
??????????? Subscriber3 sub3=new Subscriber3();
??????????? pub.NumberChanged += sub1.OnNumberChanged;
??????????? pub.NumberChanged += sub2.OnNumberChanged;
??????????? pub.NumberChanged += sub3.OnNumberChanged;
??????????? pub.DoComething(Number);
??????? }
??? class Publishser
??? {
??????? public delegate int DemoEventHandler(int num);
??????? public event DemoEventHandler NumberChanged;
??????? public void DoComething(int temp)
??????? {
??????????? if (NumberChanged != null)
??????????? {
??????????????? Delegate[] delArray = NumberChanged.GetInvocationList();??
??????????????? foreach (Delegate del in delArray)
??????????????? {
??????????????????? DemoEventHandler method = (DemoEventHandler)del;
??????????????????? temp = method(temp);
??????????????? }
??????????? }
??????????? MessageBox.Show(temp.ToString());
??????? }
??? }
??? class Subscriber1
??? {
??????? public int OnNumberChanged(int num)
??????? {
??????????? MessageBox.Show("調用了Subscriber1類,num值為:"+ num);
??????????? return num + 100; ;
??????? }
??? }
??? class Subscriber2
??? {
??????? public int OnNumberChanged(int num)
??????? {
??????????? MessageBox.Show("調用了Subscriber2類 num值為:"+num);
??????????? return num+100;
??????? }
??? }
??? class Subscriber3
??? {
??????? public int OnNumberChanged(int num)
??????? {
??????????? MessageBox.Show("調用了Subcriber3類,num值為:"+num);
??????????? return num+100;
??????? }
??? }
運行得到的結果是:
????????????????????????????? 調用了Subscriber1類,num值為:200
????????????????????????????? 調用了Subscriber2類,num值為:300
????????????????????????????? 調用了Subscriber3類,num值為:400
????????????????????????????? 500
?
現在就是我想到的結果了,利用Delegate 基類的GetInvocationList()靜態方法,可以得到委托鏈表,隨后遍歷委托鏈表依次執行,就可以得到每個方法的返回值了。
總結
以上是生活随笔為你收集整理的.Net (C#)委托和事件(获取多个返回值)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android App拥有system权
- 下一篇: 在二维数组中查找一个数