.Net (C#)委託和事件(擷取多個傳回值)

來源:互聯網
上載者:User

在講如何擷取多個傳回值之前先來看一個小例子:

 

        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()靜態方法,可以得到委託鏈表,隨後遍曆委託鏈表依次執行,就可以得到每個方法的傳回值了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.