簡體   English   中英

C#CS0079事件處理編譯錯誤

[英]C# CS0079 Event Handling Compile Errors

我無法編譯以下代碼。

編譯錯誤CS0079:事件'CustomEvent'只能出現在+ =或 - =的左側

if (CustomEvent != null)   //CS0079
    CustomEvent(null, null);  //CS0079

我怎樣才能做到這一點?

我的實現是這樣的:

public delegate void EventHandler(object sender, EventArgs e);  
public static event EventHandler CustomEvent
{
    add    { CustomEvent += value; }
    remove { CustomEvent -= value; }
 }
private static void Func()
{
    if (CustomEvent != null)      //CS0079
        CustomEvent(null, null);  //CS0079
}

您的編輯顯示遞歸調用:您正在聲明自定義事件,這意味着要提供支持字段; 例如:

private static EventHandler customEvent;
public static event EventHandler CustomEvent
{
    add    { customEvent += value; }
    remove { customEvent -= value; }
 }
private static void Func()
{
    var tmp = customEvent;
    if (tmp != null) tmp(null, null);
}

請注意,在Func我指的是字段customEvent ),而不是事件CustomEvent )。

但是,這更簡單(線程安全)作為類似字段的事件:

public static event EventHandler CustomEvent;
private static void Func()
{
    var tmp = CustomEvent;
    if (tmp != null) tmp(null, null);
}

類似字段的事件使用event關鍵字,但省略了訪問器:編譯器為您添加了許多樣板(支持字段和線程安全的添加/刪除實現)。 此外,它允許通過事件名稱 (來自聲明類型)訪問后備文件,因此行var tmp = CustomEvent; 作品。

另外:對靜態事件要非常小心; 它們是意外保持大量物體存活的好方法。

如果事件是在當前類型中聲明的類字段事件,則只能測試/調用事件 所以:有兩種情況會導致這種情況:

  1. 它不是類似字段的事件,但具有自定義add / remove訪問器:在這種情況下,只有您的自定義代碼知道如何存儲代理

  2. 它不是在當前類型中聲明,而是在基類型或某個不相關的對象中:在這種情況下,您需要通過OnCustomEvent方法獲取聲明類型來調用事件。 在基類型的情況下,慣例是使該方法protected virtual ,這允許子類調用事件通過override掛鈎到事件中


(評論)

它看起來像case1。 但是,我不明白如何解決這個問題。

如果你有自定義add / remove ,那么如何調用它是特定於實現的(如果我能看到add / remove ,我可以告訴你更多),但讓我們看看兩個常見的實現:

1a:支持代表:

private EventHandler someEvent;
public event EventHandler SomeEvent
{
    add { someEvent += value; }
    remove { someEvent -= value; }
}

在這種情況下,“調用”實現將簡單地:

if(someEvent != null) someEvent(this, EventArgs.Empty);

或者如果你感到非常謹慎:

var handler = someEvent;
if(handler != null) handler(this, EventArgs.Empty);

1b: EventHandlerList (用於稀疏事件):

private static readonly object SomeEventKey = new object();
public event EventHandler SomeEvent
{
    add { Events.AddHandler(SomeEventKey, value); }
    remove { Events.RemoveHandler(SomeEventKey, value); }
}

在這種情況下,調用實現將是:

var handler = (EventHandler)Events[SomeEventKey];
if(handler != null) handler(this, EventArgs.Empty);

暫無
暫無

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

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