日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

.Net (C#)委托和事件(获取多个返回值)

發布時間:2023/12/9 C# 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .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#)委托和事件(获取多个返回值)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。