كيفية القيام بما يلي: نشر الأحداث المتوافقة مع إرشادات NET Framework. (دليل البرمجة لـ #C)

يوضح الإجراء التالي كيفية إضافة أحداث تتبع النقش القياسي .NET Framework للفئات والبنيات الخاصه بك. جميع الأحداث في مكتبة الفئات .NET Framework تستند إلى التفويض EventHandler المُعرف كما يلي:

public delegate void EventHandler(object sender, EventArgs e);

ملاحظة

يقوم .NET Framework 2.0 بتقديم إصدار عام من هذا التفويض, EventHandler<TEventArgs>. تبين الأمثلة التالية كيفية استخدام كلا الإصدارين.

على الرغم من أن يمكن للأحداث في الفئات التي تقوم بتعريفها الاستناد على أي نوع تفويض حتى ولو أن التفويضات ترجع قيم، يستحسن بشكل عام إسناد الأحداث الخاصه بك على النقش .NET Framework باستخدام EventHandler، كما هو موضح في المثال التالي.

لنشر الأحداث استناداً إلى النقش EventHandler

  1. (تجاوز هذه الخطوة وانتقل إلى الخطوة 3a إذا لم يجب عليك إرسال بيانات مخصصه مع الحدث الخاص بك.) قم بتعريف الفئة الخاصه بك في نطاق مرئي بالنسبة إلى الفئات الناشرة والفئات المشترِكة, وقم بإضافة الأعضاء المطلوبة للاحتفاظ ببيانات حدثك المخصصة. في هذا المثال، يتم إرجاع سلسلة بسيطة.

    public class CustomEventArgs : EventArgs
    {
        public CustomEventArgs(string s)
        {
            msg = s;
        }
        private string msg;
        public string Message
        {
            get { return msg; }
        } 
    }
    
  2. (تجاوز هذه الخطوة إذا كنت تستخدم الإصدار العام من EventHandler<TEventArgs> .) قم بتعريف تفويض في الفئة الناشرة. قم بإعطائها اسم ينتهي بـ "EventHandler. تعيّن المعلمة الثانية نوع الـ EventArgs المخصصة.

    public delegate void CustomEventHandler(object sender, CustomEventArgs a);
    
  3. قم بتعريف الحدث في الفئة الناشرة الخاصة بك باستخدام إحدى الخطوات التالية.

    1. إذا لم يكن لديك أية فئة EventArgs مخصصة سيكون نوع الحدث الخاص بك تفويض EventHandler الغير عام. لا يجب عليك تعريفه لأنه تم بالفعل تعريفه في مساحة الاسم System الذي يتم تضمينه عندما تقوم بإنشاء مشروع #C:

      public event EventHandler RaiseCustomEvent;
      
    2. إذا كنت تستخدم الإصدار الغير عام من EventHandler ولديك فئة مخصصة مشتقة من EventArgs، قم بتعريف الحدث داخل الفئة الناشرة واستخدم التفويض كنوع:

      class Publisher
      {
          public event CustomEventHandler RaiseCustomEvent;
      }
      
    3. إذا كنت تستخدم الإصدار العام فلست بحاجة إلى تفويض مخصص. بدلاً من ذلك، تقوم بتحديد نوع الحدث كـ 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();

        }
    }
}

راجع أيضًا:

المرجع

الأحداث (دليل البرمجة لـ #C)

التفويضات (دليل البرمجة لـ #C)

Delegate

المبادئ

دليل البرمجة لـ #C

تصميم الحدث