C#
②ラムダでthisを意図せずキャプチャ
出典: C# のコールバック・デリゲート・イベントの違いを業務SEが30分で腹落ちさせる — ハマりポイント3つ—俺が踏んだやつ / ②ラムダでthisを意図せずキャプチャ
// ❌ NG:ラムダで登録すると、解除しようとしても同じ参照が作れない
manager.DataUpdated += data => this.Process(data);
// ↓これだと別のラムダ→解除できない
manager.DataUpdated -= data => this.Process(data);
// ✅ OK:メソッド参照で登録すれば同じ参照で解除できる
manager.DataUpdated += this.Process;
manager.DataUpdated -= this.Process;
// ✅ OK:ラムダを変数に保存しておいて同じ参照を使う
Action<DataPayload> handler = data => this.Process(data);
manager.DataUpdated += handler;
//あとで
manager.DataUpdated -= handler;
▸ この snippet は実行結果未収録
▸ 実行結果は未収録です
Source収録記事
この snippet は記事の「ハマりポイント3つ—俺が踏んだやつ / ②ラムダでthisを意図せずキャプチャ」セクションに登場する。コードの前後の文脈・ハマりどころの解説は記事本文で。
同じ記事から
9 件//抽象的なコールバックの構造 //「呼ぶ側」が「呼ばれる側」に処理を渡しておく void DoSomething(コールバック型callback) {未収録
コールバックは「概念」、C#以前から存在する
#c51e4f151e8e
//メソッドのシグネチャを型として宣言 public delegate bool ValidationFunc(string input); public class Validator未収録
①自前delegate宣言
#3e9360c3bce4
// Action:戻り値なし Action<int> log = n => Console.WriteLine($"value={n}"); log(42);
▶ 実行可
② Action / Func(標準ジェネリックデリゲート)
#be40399f77a4
// 1行ラムダ Func<int, int> square = x => x * x; //複数行ラムダ
▶ 実行可
③ラムダ式・匿名メソッド
#c9dabbaae3dc
//イベントを生やすクラス側 public class FileWatcher { public event Action<string> FileChanged; // ←デリゲート型+ eventキーワード
▶ 実行可
+= / -=の正体
#b5d4dfa3116b
//標準形 public event EventHandler<MyEventArgs> ItemSelected; //発火
▶ 実行可
EventHandler系の慣習
#3707bc4ea319
