[英]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;
作品。
另外:對靜態事件要非常小心; 它們是意外保持大量物體存活的好方法。
如果事件是在當前類型中聲明的類字段事件,則只能測試/調用事件 。 所以:有兩種情況會導致這種情況:
它不是類似字段的事件,但具有自定義add
/ remove
訪問器:在這種情況下,只有您的自定義代碼知道如何存儲代理
它不是在當前類型中聲明,而是在基類型或某個不相關的對象中:在這種情況下,您需要通過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.