0Pricing
C# Academy · درس

الأحداث: النشر والاشتراك، والكلمة المفتاحية event

طبّق النشر والاشتراك باستخدام الأحداث: عرّف event، وأضف المعالجات وأزلها، ومرّر البيانات عبر EventArgs، وأطلق الحدث وفق نمط OnX.

الأحداث: النشر والاشتراك، والكلمة المفتاحية event درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 2 من أصل 3. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 3 دروس في المجموع.

نظرة عامة على الأحداث

الهدف: النشر والاشتراك باستخدام الأحداث.

  • التصريح بـ event على الناشر
  • الاشتراك باستخدام += وإلغاء الاشتراك باستخدام -=
  • إطلاق الحدث بأمان في الناشر
  • تمرير البيانات باستخدام EventArgs

الاستخدام الأساسي للأحداث

اعرض event ودَع المستمعين يربطون معالجاتهم ويفصلونها. الناشر وحده يستدعيه.

using System;

public class Button
{
  public event EventHandler Click;

  public void SimulateClick()
  {
    // Safe raise: copy then invoke if not null (C# 6-safe)
    EventHandler h = Click;
    if (h != null) h(this, EventArgs.Empty);
  }
}

public class Program
{
  static void OnClick(object sender, EventArgs e)
  {
    Console.WriteLine("Clicked!");
  }

  public static void Main(string[] args)
  {
    Button b = new Button();
    b.Click += OnClick;    // subscribe
    b.SimulateClick();     // prints "Clicked!"

    b.Click -= OnClick;    // unsubscribe
    b.SimulateClick();     // no output
  }
}

حدث مع بيانات

استخدم EventArgs (أو EventHandler<TEventArgs>) لتمرير بيانات مفيدة إلى المشتركين.

using System;

// Data for the event
public sealed class PriceChangedEventArgs : EventArgs
{
  public decimal OldPrice { get; private set; }
  public decimal NewPrice { get; private set; }
  public PriceChangedEventArgs(decimal oldP, decimal newP)
  {
    OldPrice = oldP; NewPrice = newP;
  }
}

public sealed class Product
{
  private decimal _price;
  public event EventHandler<PriceChangedEventArgs> PriceChanged;

  public decimal Price
  {
    get { return _price; }
    set
    {
      if (value != _price)
      {
        decimal old = _price;
        _price = value;
        EventHandler<PriceChangedEventArgs> h = PriceChanged;
        if (h != null) h(this, new PriceChangedEventArgs(old, _price));
      }
    }
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    Product p = new Product();
    p.PriceChanged += delegate(object s, PriceChangedEventArgs e)
    {
      Console.WriteLine("Price: " + e.OldPrice + " -> " + e.NewPrice);
    };
    p.Price = 10m;
    p.Price = 12m;
  }
}

تعدد الإرسال وتعبيرات lambda

الأحداث متعددة الإرسال: تُشغّل معالجات متعددة بترتيب الاشتراك. استخدم معالجات مسماة أو مجهولة.

using System;

public class Alarm
{
  public event EventHandler Ring;

  public void Trigger()
  {
    EventHandler h = Ring;
    if (h != null) h(this, EventArgs.Empty);
  }
}

public class Program
{
  static void HandlerA(object s, EventArgs e) { Console.WriteLine("A"); }
  static void HandlerB(object s, EventArgs e) { Console.WriteLine("B"); }

  public static void Main(string[] args)
  {
    Alarm a = new Alarm();
    a.Ring += HandlerA;                           // named
    a.Ring += delegate(object s, EventArgs e) { Console.WriteLine("lambda"); }; // anon
    a.Ring += HandlerB;

    a.Trigger(); // prints A, lambda, B (multicast order)
  }
}

نمط إطلاق OnX

استخدم أسلوبًا محميًا باسم OnX لإطلاق الأحداث. انسخ المفوض إلى متغير محلي وتحقق من أنه ليس null قبل استدعائه.

using System;

public class Ticker
{
  public event EventHandler Tick;

  protected virtual void OnTick()
  {
    EventHandler h = Tick;          // copy to local
    if (h != null) h(this, EventArgs.Empty);
  }

  public void RunOnce()
  {
    // do work...
    OnTick(); // raise via protected method
  }
}

public class Program
{
  static void Show(object s, EventArgs e) { Console.WriteLine("Tick!"); }

  public static void Main(string[] args)
  {
    Ticker t = new Ticker();
    t.Tick += Show;
    t.RunOnce();
  }
}

نصائح الأحداث ومحاذيرها

نصائح:

  • ألغِ الاشتراك دائمًا ( -= ) عندما لا تعود هناك حاجة إلى المشترك.
  • اجعل المعالجات قصيرة؛ وينبغي وضع الأعمال الطويلة في قائمة انتظار.
  • استخدم EventArgs (أو فئة فرعية منه) لتمرير البيانات.
  • ينبغي للناشر وحده إطلاق الحدث.

دور الكلمة الأساسية event

تحقق سريع: ما الكلمة الأساسية في C# التي تعرض مفوضًا للاشتراك وإلغاء الاشتراك، مع منع الكود الخارجي من استدعائه مباشرة؟

مراجعة

مراجعة: صرّح بـ event، ودَع المستمعين يربطون معالجاتهم ويفصلونها، ومرّر البيانات باستخدام EventArgs، وأطلق الحدث عبر أسلوب محمي باسم OnX.

الأسئلة الشائعة

هل درس «الأحداث: النشر والاشتراك، والكلمة المفتاحية event» مجاني؟

نعم — نص درس «الأحداث: النشر والاشتراك، والكلمة المفتاحية event» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 3 دروس في المجموع.

ماذا ستتعلم في «الأحداث: النشر والاشتراك، والكلمة المفتاحية event»؟

طبّق النشر والاشتراك باستخدام الأحداث: عرّف event، وأضف المعالجات وأزلها، ومرّر البيانات عبر EventArgs، وأطلق الحدث وفق نمط OnX. تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟

لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 3.

كم من الوقت يستغرق درس «الأحداث: النشر والاشتراك، والكلمة المفتاحية event»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟

نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. delegate وAction/Func والإغلاقات
  2. الأحداث: النشر والاشتراك، والكلمة المفتاحية event
  3. أنماط الأحداث ومشكلاتها (تسرّب الذاكرة)
← العودة إلى C# Academy