宣佈和提高事件
宣告事件
你可以使用以下語法在任何 class
或 struct
上宣告事件:
public class MyClass
{
// Declares the event for MyClass
public event EventHandler MyEvent;
// Raises the MyEvent event
public void RaiseEvent()
{
OnMyEvent();
}
}
有一個用於宣告事件的擴充套件語法,你可以在其中儲存事件的私有例項,並使用 add
和 set
訪問器定義公共例項。語法與 C#屬性非常相似。在所有情況下,上面演示的語法應該是首選,因為編譯器會發出程式碼以幫助確保多個執行緒可以安全地向類上的事件新增和刪除事件處理程式。
舉辦活動
Version >= 6
private void OnMyEvent()
{
EventName?.Invoke(this, EventArgs.Empty);
}
Version < 6
private void OnMyEvent()
{
// Use a local for EventName, because another thread can modify the
// public EventName between when we check it for null, and when we
// raise the event.
var eventName = EventName;
// If eventName == null, then it means there are no event-subscribers,
// and therefore, we cannot raise the event.
if(eventName != null)
eventName(this, EventArgs.Empty);
}
請注意,事件只能通過宣告型別引發。客戶只能訂閱/取消訂閱。
對於 6.0 之前的 C#版本,其中不支援 EventName?.Invoke
,最好在呼叫之前將事件分配給臨時變數,如示例所示,這可確保在多個執行緒執行相同程式碼的情況下的執行緒安全性。如果多個執行緒正在使用相同的物件例項,則在未執行此操作的情況下可能會導致丟棄 NullReferenceException
。在 C#6.0 中,編譯器發出的程式碼類似於 C#6 的程式碼示例中所示的程式碼。