宣布和提高事件

声明事件

你可以使用以下语法在任何 classstruct 上声明事件:

public class MyClass
{
    // Declares the event for MyClass
    public event EventHandler MyEvent;

    // Raises the MyEvent event
    public void RaiseEvent()
    {
        OnMyEvent();
    }
}    

有一个用于声明事件的扩展语法,你可以在其中保存事件的私有实例,并使用 addset 访问器定义公共实例。语法与 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 的代码示例中所示的代码。