C# 中delegate和event的區別


event是一種特殊的delegate,定義它們的類里邊,這二者是一樣的,既可以采用 += 和-=的運算符號,也可以調用,但是在這個類之外,它們是不同的。

同為public類型,對於delegate,我們在定義它的類外,不僅可以采用 += 和-=的運算符號,還可隨時調用;但是對於event,在類外只能采用 += 和-=的運算符號,不能調用,也就是event把它本身的invoke函數和括號調用的函數變成擁有這個event類的私有函數。

舉個例子:

public class Publisher

    {

        public delegate void SampleEventHandler(string e);  

        public event SampleEventHandler SampleEvent;  //  只能在類內部調用

        public SampleEventHandler NoEvent;//可以在類外調用

        protected void RaiseSampleEvent(string str) //聲明一個方法,調用類內部的event,一邊外部可以調用類內部的event

        {

            // 調用類內部的event,沒有問題

            SampleEvent(str);

        }

    } 

 

//外部的調用

 public void testEvent()

        {

            Publisher publisher = new Publisher();

            publisher.NoEvent += TestEvent;  //給delegate賦值。

            publisher.NoEvent("e"); // 調用delegate,沒有問題          

            publisher.SampleEvent += TestEvent; // 給event賦值,這沒有問題

            publisher.SampleEvent("e"); //調用event,這個就錯了,只能在Publisher內部調用

        }

還有一點,event只能被本類調用,其他的即使該類的派生類也不行,如果非要調用類內部的event,可以先聲明一個方法,在該方法中調用event,例如Publisher類中的RaiseSampleEvent方法。

MSDN中關於在派生類中調用event

在創建可用作其他類的基類的類時,應考慮如下事實:事件是特殊類型的委托,只可以從聲明它們的類中調用。 派生類無法直接調用基類中聲明的事件。 盡管有時需要事件僅由基類引發,但在大多數情形下,應該允許派生類調用基類事件。 為此,您可以在包含該事件的基類中創建一個受保護的調用方法。 通過調用或重寫此調用方法,派生類便可以間接調用該事件。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM