C#中的委託和事件

來源:互聯網
上載者:User

標籤:blog   http   io   ar   sp   for   strong   on   2014   

簡單談一下對委託的認識,算是對這篇部落格( 這裡)的理解和概括吧!


委託(Delegate)首先可以看做一個特殊的類,而一些函數是他的變數取值範圍。

如聲明一個委託:public delegate void GreetingDelegate(string name);那麼我們在別的函數中把函數名當做變數傳進來,這樣子就可以調用相應的函數了。委託應該先聲明才能用,注意作用範圍。在任意函數裡就可以用這個委託了。public void GreetingPeople(string name, GreetingDelegate MakeGreeting);  第二個參數就可以賦值為不同的函數名。可以這樣子 調用這個函數,GreetingPeople("Bruce", ChineseGreering); 或者 GreetingPeople(string name, EnglishGreeting); 注意這裡的兩個函數 ChineseGreeting 和 EnglishGreeting 得和GreetingDelegate的類型一樣(返回值,參數)。

我們可以聲明一個委託類型,並把函數賦值(或者說改叫綁定了)過來,如 GreetingDelegate delegate1; delegate1 = EnglishGreeting; delegate1 +=  ChineseGreeting; 這樣子可以同時調用兩個函數了,當然,這裡的參數是一樣的。

這裡的 delegate1 既然是一個特殊的函數,那麼就可以像函數那樣直接調用:delegate1("Bruce"); 效果是一樣的。

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace ConsoleApplication2{    public delegate void GreetingDelegate(string name);    class Program    {        private static void EnglishGreeting(string name)        {            Console.WriteLine("Good morning!  " + name);        }        private static void ChineseGreeing(string name)        {            Console.WriteLine("您好!  " + name);        }        private static void Greeting(string name, GreetingDelegate MakeGreeting)        {            MakeGreeting(name);        }        static void Main(string[] args)        {            GreetingDelegate delegate1, delegate2;            delegate1 = ChineseGreeing;            delegate1 += EnglishGreeting;            delegate2 = EnglishGreeting;            Greeting("張小彬", delegate1);            Greeting("Bruce", delegate2);            Console.ReadKey();                    }    }}



事件(Event)是一個特殊的委託變數,只是封裝了委託類型的變數。

event 和 delegate1 只是訪問權相不一樣,對委託的變數,類型定義為public(太暴露)和private(失去作用)都不合適,於是event出現了。事件變數(或者說委託變數)在類的內部相當於是私人的,在外部只能有+=和-=操作。


Observer設計模式

Observer設計模式有兩類身份,一個叫做Subject,即目標,監視的對象;另一個叫做Observer,即監視者。Subject一旦有某些特定的行為(如學生,作弊的行為),那麼註冊過的Observer會相應該行為(如老師,立刻過去沒收考卷)。Observer設計模式是一種松耦合的設計模式。我們一般在Subject中定義事件(Event)和觸發規則。下面是一個加熱器的例子,顯然不符合微軟的規範,但是對理解概念很有協助

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace ConsoleApplication3{    public class Heater    {        private int temperature;        public delegate void NowHandler(string param);        public event NowHandler MyEvent;        public void heat()        {            for (int i = 0; i <= 100; ++i)            {                temperature = i;                if (temperature > 95)                {                    MyEvent(i + "");                }            }        }    }    public class Alarm    {        public void AlarmNow(string param)        {            Console.WriteLine("Alarm: Fire! Fire!" + param);        }    }    public class Display    {        public void DisplayNow(string param)        {            Console.WriteLine("Display: Fire! Fire!" + param);        }    }    class Program    {        static void Main(string[] args)        {            Heater heater = new Heater();            Alarm alarm = new Alarm();            Display display = new Display();            heater.MyEvent += alarm.AlarmNow;            heater.MyEvent += display.DisplayNow;            heater.heat();            Console.ReadKey();        }    }}



C#中的委託和事件

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.