127

myDelegate -= eventHandlerReSharper (バージョン 6) の問題を使用する場合:

デリゲート減算の結果が予測できない

この背後にある合理性は、JetBrains によってここで説明されています。説明は理にかなっており、それを読んだ後、-デリゲートのすべての使用法を疑っています。

どのように

  • ReSharper を不機嫌にさせずに非自動イベントを作成できますか?
  • または、これを実装するためのより良いおよび/または「正しい」方法はありますか?
  • または、ReSharper を無視できますか?

簡略化されたコードは次のとおりです。

public delegate void MyHandler (object sender);

MyHandler _myEvent;

public event MyHandler MyEvent
{
    add
    {
        _myEvent += value;
        DoSomethingElse();
    }
    remove
    {
        _myEvent -= value; // <-- ReSharper warning here
    }
}
4

3 に答える 3

139

恐れるな!ReSharper の警告の最初の部分は、デリゲートのリストの削除にのみ適用されます。コードでは、常に 1 つのデリゲートを削除しています。2 番目の部分では、重複したデリゲートが削除された後のデリゲートの順序について説明します。イベントは、サブスクライバーの実行順序を保証しないため、実際には影響しません。

上記のメカニズムは予測不可能な結果につながる可能性があるため、ReSharper はデリゲート減算演算子に遭遇するたびに警告を発行します。

ReSharper がこの警告を発行しているのは、マルチキャスト デリゲートの減算に問題がある可能性があるためです。その言語機能を完全に非難しているわけではありません。幸いなことに、これらの落とし穴はごくまれなケースであり、単純なイベントをインストルメント化するだけであれば、それらに遭遇する可能性はほとんどありません。add独自の/ハンドラを実装するより良い方法はありませんremove。注意する必要があります。

そのメッセージに対するReSharperの警告レベルを「ヒント」に下げることをお勧めします。これにより、通常は役立つ警告に鈍感にならないようになります。

于 2012-06-24T18:32:14.000 に答える
30

合計または減算にデリゲートを直接使用しないでください。代わりにあなたのフィールド

MyHandler _myEvent;

代わりに、イベントとしても宣言する必要があります。これにより、ソリューションを危険にさらすことなく問題が解決され、イベントを使用する利点があります。

event MyHandler _myEvent;

デリゲートを単に割り当てるだけでイベントが失われる可能性があるため、デリゲートの合計または減算の使用は危険です (宣言によると、開発者はこれがイベントとして宣言されている場合のようにマルチキャスト デリゲートであると直接推測しません)。例として、この質問で言及されているプロパティがイベントとしてフラグ付けされていない場合、以下のコードは、誰かが単にデリゲートに割り当てられているため、最初の 2 つの割り当てが失われるケースを示します (これも有効です!)。

myObject.MyEvent += Method1; 
myObject.MyEvent += Method2;
myObject.MyEvent = Method3;

Method3 を割り当てると、最初の 2 つのサブスクリプションが完全に失われました。イベントを使用すると、この問題が回避され、同時に ReSharper の警告が削除されます。

于 2015-10-28T16:12:14.250 に答える
-17

-= を使用する代わりに = null に設定します

于 2015-02-23T16:55:50.840 に答える