イベント:発行と購読、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 キーワードの役割
まとめ
まとめ: 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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- delegate、Action/Func、クロージャ
- イベント:発行と購読、eventキーワード
- イベントパターンと注意点(メモリリーク)