روند زیر چگونگی افزودن رویدادهایی که از الگوی استاندارد دات نت پیروی می کنند را به کلاس ها و ساختارها ، توضیح می دهد. همه رویدادها در کتابخانه کلاس Net Framework. بر پایه وکیل EventHandler می باشند، که بصورت زیر تعریف شده اند:
public delegate void EventHandler(object sender, EventArgs e);
نکته
نسخه 2.0 دات نت فریم وورک یک نسخه جنریک (generic) از این وکیل (delegate) بصورت <EventHandler<TEventArgs معرفی می کند. مثال های زیر چگونگی استفاده از هر دو نسخه را نشان می دهد. هر چند رویدادهای موجود در کلاس هایی که شما تعریف می کنید، می توانند بر پایه هر وکیل معتبری باشند؛ حتی وکیل هایی که یک مقدار را برگشت می دهند، عموما" پیشنهاد می شود که با استفاده از EventHandler ، رویداد هایتان را روی الگوی دات نت فریم وورک ، پایه گزاری کنید. بصورتی که در مثال زیر نشان داده شده است.
انتشار (publish) رویدادهای بر پایه الگوی EventHandler
1- (اگر مجبور نیستید که به همراه رویدادتان ، داده های سفارشی بفرستید، این مرحله را رد کرده و به مرحله 3a بروید.) کلاس خود را در یک حوزه (scope) که برای کلاس های ناشر (publisher) و کلاس های متعهد (subscriber) قابل مشاهده باشد اعلان کرده و اعضای لازم برای نگهداری داده های سفارشی را به آن اضافه کنید. در این مثال یک رشته (string) ساده برگشت داده می شود.
public class CustomEventArgs : EventArgs { public CustomEventArgs(string s) { msg = s; } private string msg; public string Message { get { return msg; } } }
public delegate void CustomEventHandler(object sender, CustomEventArgs a);
الف) اگر هیچ کلاس EventArgs سفارشی ای ندارید، نوع رویداد شما از نوع وکیل غیر-جنریک EventHandler خواهد بود. مجبور نیستید که آنرا اعلان کنید، زیرا قبلا" در فضای نام System اعلان شده است و در هنگام ساختن پروژه #C به پروژه الحاق می شود:
public event EventHandler RaiseCustomEvent;
ب) اگر از نسخه غیر-جنریک EventHandler استفاده می کنید و یک کلاس سفارشی که از EventArgs مشتق شده ، دارید؛ رویداد خود را در کلاس ناشر اعلان کنید و از وکیل خود برای نوع آن استفاده کنید:
class Publisher { public event CustomEventHandler RaiseCustomEvent; }
ج) اگر از نسخه جنریک استفاده می کنید، به وکیل سفارشی نیاز ندارید. ولی بجای آن، رویدادتان را بصورت <EventHandler<CustomEventArgs و بین علامت های <> نام کلاس خودتان را بنویسید.
public event EventHandler<CustomEventArgs> RaiseCustomEvent;
مثال
مثال زیر مراحل قبل را با استفاده از کلاس EventArgs و <EventHandler<TEventArgs به عنوان نوع رویداد، توضیح می دهد.
namespace DotNetEvents { using System; using System.Collections.Generic; // Define a class to hold custom event info public class CustomEventArgs : EventArgs { public CustomEventArgs(string s) { message = s; } private string message; public string Message { get { return message; } set { message = value; } } } // Class that publishes an event class Publisher { // Declare the event using EventHandler<T> public event EventHandler<CustomEventArgs> RaiseCustomEvent; public void DoSomething() { // Write some code that does something useful here // then raise the event. You can also raise an event // before you execute a block of code. OnRaiseCustomEvent(new CustomEventArgs("Did something")); } // Wrap event invocations inside a protected virtual method // to allow derived classes to override the event invocation behavior protected virtual void OnRaiseCustomEvent(CustomEventArgs e) { // Make a temporary copy of the event to avoid possibility of // a race condition if the last subscriber unsubscribes // immediately after the null check and before the event is raised. EventHandler<CustomEventArgs> handler = RaiseCustomEvent; // Event will be null if there are no subscribers if (handler != null) { // Format the string to send inside the CustomEventArgs parameter e.Message += String.Format(" at {0}", DateTime.Now.ToString()); // Use the () operator to raise the event. handler(this, e); } } } //Class that subscribes to an event class Subscriber { private string id; public Subscriber(string ID, Publisher pub) { id = ID; // Subscribe to the event using C# 2.0 syntax pub.RaiseCustomEvent += HandleCustomEvent; } // Define what actions to take when the event is raised. void HandleCustomEvent(object sender, CustomEventArgs e) { Console.WriteLine(id + " received this message: {0}", e.Message); } } class Program { static void Main(string[] args) { Publisher pub = new Publisher(); Subscriber sub1 = new Subscriber("sub1", pub); Subscriber sub2 = new Subscriber("sub2", pub); // Call the method that raises the event. pub.DoSomething(); // Keep the console window open Console.WriteLine("Press Enter to close this window."); Console.ReadLine(); } } }