C# Academy · บทเรียน

เหตุการณ์: การเผยแพร่/การสมัครรับ คีย์เวิร์ด event

เผยแพร่/สมัครรับด้วยเหตุการณ์: ประกาศ event เพิ่มหรือนำตัวจัดการออก ส่งข้อมูลผ่าน EventArgs และเรียกใช้ตามรูปแบบ OnX

บทเรียน 2 จาก 38 ขั้นตอน

เหตุการณ์: การเผยแพร่/การสมัครรับ คีย์เวิร์ด event เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 3 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 3 บทเรียน

ภาพรวมของเหตุการณ์

เป้าหมาย: เผยแพร่/สมัครรับด้วย เหตุการณ์

  • ประกาศ เหตุการณ์บนผู้เผยแพร่
  • สมัครรับด้วย += และยกเลิกการสมัครรับด้วย -=
  • ส่งสัญญาณเหตุการณ์อย่างปลอดภัยในผู้เผยแพร่
  • ส่งข้อมูลโดยใช้ EventArgs

การใช้เหตุการณ์พื้นฐาน

เปิดเผย เหตุการณ์ แล้วให้ตัวรับฟังเชื่อมต่อหรือถอดการเชื่อมต่อได้ มีเพียงผู้เผยแพร่เท่านั้นที่เรียกใช้เหตุการณ์ได้

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;
  }
}

มัลติแคสต์และแลมบ์ดา

เหตุการณ์เป็นแบบ มัลติแคสต์: ตัวจัดการหลายตัวจะทำงานตามลำดับการสมัครรับ ใช้ตัวจัดการที่ตั้งชื่อไว้หรือไม่ระบุชื่อก็ได้

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 ที่มีการเข้าถึงแบบ protected เพื่อส่งสัญญาณเหตุการณ์ คัดลอก delegate ไปไว้ในตัวแปรเฉพาะที่ แล้วตรวจสอบว่าไม่เป็นค่าว่างก่อนเรียกใช้

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# ใดที่เปิดเผย delegate สำหรับการสมัครรับและยกเลิกการสมัครรับ พร้อมป้องกันไม่ให้โค้ดภายนอกเรียกใช้ delegate โดยตรง

ทบทวน

ทบทวน: ประกาศ เหตุการณ์ ให้ตัวรับฟังเชื่อมต่อหรือถอดการเชื่อมต่อ ส่งข้อมูลด้วย EventArgs และส่งสัญญาณผ่านเมธอด OnX ที่มีการเข้าถึงแบบ protected

เริ่มต้นได้ฟรี

เรียนรู้ C# ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
93
บทเรียน
346

คำถามที่พบบ่อย

บทเรียน “เหตุการณ์: การเผยแพร่/การสมัครรับ คีย์เวิร์ด event” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “เหตุการณ์: การเผยแพร่/การสมัครรับ คีย์เวิร์ด event” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 3 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “เหตุการณ์: การเผยแพร่/การสมัครรับ คีย์เวิร์ด event”

เผยแพร่/สมัครรับด้วยเหตุการณ์: ประกาศ event เพิ่มหรือนำตัวจัดการออก ส่งข้อมูลผ่าน EventArgs และเรียกใช้ตามรูปแบบ OnX คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 3 บทเรียน

บทเรียน “เหตุการณ์: การเผยแพร่/การสมัครรับ คีย์เวิร์ด event” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม

ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. delegate, Action/Func, คลอสเชอร์
  2. เหตุการณ์: การเผยแพร่/การสมัครรับ คีย์เวิร์ด event
  3. รูปแบบเหตุการณ์และข้อควรระวัง (หน่วยความจำรั่ว)
← กลับไปที่ C# Academy