// Define a delegate type.
public delegate void SimpleDelegate();
public class Publisher
{
// Define an event of type SimpleDelegate.
public event SimpleDelegate MyEvent;
// A method that invokes the event.
public void RaiseEvent()
{
MyEvent?.Invoke();
}
}
public class Subscriber
{
// A method to be called when the event is invoked.
public void EventHandler()
{
Console.WriteLine("Event Handler Called");
}
}
public class Program
{
public static void Main()
{
Publisher publisher = new Publisher();
Subscriber subscriber = new Subscriber();
// Add the subscriber's event handler to the event's invocation list.
publisher.MyEvent += subscriber.EventHandler;
// Invoke the event. This will call all methods in its invocation list.
publisher.RaiseEvent(); // Outputs: "Event Handler Called"
}
}
以上为一个Event注册的代码,当Program的实例没有被销毁时,从其他任何地方Raise都可以,因为Event 是一个方法指针,Invoke相当于引用。
注意当实例注册事件,并在一段时间销毁时,又没有注销事件,我们依然可以Invoke它,因为一旦我们注册了它,C#就会分配一片空间给它,并且除非我们主动注销,它将永远存在,这会造成一些内存上的问题。
所以一定要主动注销。