0Pricing
C# Academy · レッスン

イベント:発行と購読、eventキーワード

イベントで発行と購読を行います。eventを宣言し、ハンドラーを追加・削除し、EventArgsでデータを渡し、OnXパターンでイベントを発生させます。

「イベント:発行と購読、eventキーワード」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン2/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これは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 メソッドを使用してイベントを発生させます。デリゲートをローカル変数にコピーし、呼び出す前に 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時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全3レッスンが含まれています。

「イベント:発行と購読、eventキーワード」で何を学びますか?

イベントで発行と購読を行います。eventを宣言し、ハンドラーを追加・削除し、EventArgsでデータを渡し、OnXパターンでイベントを発生させます。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C# Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/3です。

「イベント:発行と購読、eventキーワード」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC# Academyレッスンでコードを書いて実行できますか?

はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. delegate、Action/Func、クロージャ
  2. イベント:発行と購読、eventキーワード
  3. イベントパターンと注意点(メモリリーク)
← C# Academyに戻る