簡體   English   中英

為什么我們要指定一個委托和一個事件,為什么不只在C#中使用一個事件呢?

[英]Why do we specify a delegate along with an event, why not just use an event in C#?

為什么要在事件中指定委托,為什么不在C#中使用事件呢?

例如,我有以下代碼:

class Shop
{
    internal delegate void _EventHandler(object sender, GoodsInfoEventArgs e);
    internal event _EventHandler GoodsArrived;

    public void BringGoods(string goods)
    {
        if (GoodsArrived != null)
        {
            GoodsArrived(this, new GoodsInfoEventArgs(goods));
        }
    }
}

為什么開發C#的人為什么不通過以下方式實現事件:

class Shop
{
    internal event _EventHandler GoodsArrived;

    public void BringGoods(string goods)
    {
        if (GoodsArrived != null)
        {
            GoodsArrived(this, new GoodsInfoEventArgs(goods));
        }
    }
}

我的意思是沒有代表。

我知道該事件在C#中的工作方式。 如果有的話,它將只調用所有訂閱的委托,否則將等於null。 我也知道事件與代表之間的區別。 該事件僅允許委托的加法或減法,但不允許更改指針(我們可以對事件執行+=-=操作,但不能對事件執行=操作),而委托則允許所有加法,減法操作並執行分配操作。 因此,該事件是委托周圍的包裝器,並且包裝器允許控制委托可以更改的方式。

話雖如此,我不明白在要求定義事件的程序的每個位置都定義一個委托的背后原因。

如果您不理解我的問題,請向我詢問,我將提供更多信息。

謝謝。

對不起,我很困惑。 我的意思是,為什么不使用這樣的東西:

internal event _EventHandler(object sender, GoodsInfoEventArgs e) GoodsArrived;

正如您在問題中提到的,事件提供了訂閱和退訂的機制。 但是,要求委托定義可以處理事件的方法的簽名。 有一個默認簽名(帶參數sender和args的空值),但是您可以對EventArgs使用另一種類型,例如也可以省略sender參數。

此外,還有一個預定義的委托 EventHandler可以使用,因此如果您堅持使用默認簽名並使用EventArgs作為參數,則不必自己創建委托。

internal event EventHandler GoodsArrived;

如果要為事件參數提供自定義類,則可以使用委托通用版本

public class MyEventArgs : EventArgs 
{
  // ...
}

internal event EventHandler<MyEventArgs> GoodsArrived;

至於您的更新,如果您使用一個現成的EventHandler委托,那么您就快到了。 您具有標准簽名,不需要自己創建委托。

將事件基於委托人的決定提供了您可能需要或可能不需要的很多靈活性。 您可以定義僅使用正確參數集的事件,也可以將現有委托重用於多個事件。 默認的EventHandler實現大大簡化了工作,並支持您定義符合最佳實踐的事件(而不會失去靈活性)。

從我的觀點和經驗來看,直接在事件中定義簽名不會增加太多。 只需使用開箱即用的EventHandler委托即可; 您可以立即識別簽名,而不必自己定義委托。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM