匿名の代表者を介したイベントのunsubscription [複製
-
26-10-2019 - |
質問
この質問にはすでに答えがあります:
- C#で匿名のメソッドを登録解除 11の回答
Resharper 5.1コード分析を何度も使用しています。
「匿名の代表者によるイベントのunsubscription」
#Part of Code
if (((bool)e.NewValue))
{
listView.PreviewTextInput += (o,args) =>
listView_PreviewTextInput(o,args,listView);
}
else
{
listView.PreviewTextInput -= (o, args) =>
listView_PreviewTextInput(o, args, listView);
}
どうすればこのことを修正または最適化できますか
解決
Lamdbaを変数に抽出できます。
EventHandler func = (sender, e) =>
listView_PreviewTextInput(sender, e, listView);
if (((bool)e.NewValue))
{
listView.PreviewTextInput += func;
}
else
{
listView.PreviewTextInput -= func;
}
他のヒント
警告!受け入れられた答え スティーブンから 違う, 、それがすることは、Resharperが警告している問題をマスキングすることだけです。
指定されたコードが実行されるたびに
EventHandler func = (sender, e) =>
listView_PreviewTextInput(sender, e, listView);
あなたは新鮮になるでしょう(あなたは異なるキャプチャをキャプチャするかもしれないので listView
)保存された匿名のデリゲートのインスタンス func
, 、まだどんなイベントにもサブスクライブされていないインスタンスなので、このコード
listView.PreviewTextInput -= func;
購読していないイベントから登録解除できないため、効果的に何もしません。これにより、イベントハンドラー「2回の呼び出し」、メモリリークなどの気が遠くなるようなバグが発生します。
実際、ジョン・スキートはそれを言います 場合によっては機能する場合があります:
C#仕様は、2つの匿名関数(匿名の方法またはLambda式)がある場合、それを明示的に述べています(IIRC) かもしれないし、そうでないかもしれません そのコードから平等な代表を作成します。
たとえば、コンパイラが毎回新しいインスタンスを生成しない場合、素敵な動作が表示されます。
しかし、それは信頼性がなく、キャプチャされた変数を使用したスターターの質問に記載されている場合には確かに機能しません listView
.
だから私の提案は次のとおりです。
匿名関数をイベントハンドラーとして使用してください。
所属していません StackOverflow