2009-07-21 14 views
0

多分愚かな質問ですが、危険ですか?イベントについて

私のコードでは、私はいくつかの場所で以下の構造を使用しています。

void MyFunction() 
{ 
    DoSomething(myClass.myProperty) 

    myClass.PropertyChanged += (s,e) => { 
     if (e.PropertyName == "myProperty") { 
     DoSomething(myClass.myProperty); 
     } 
    } 
} 

私は最初に何かしたいと思いますし、将来的にプロパティが変更されても同じことをしたいと思います。

今、問題はMyFunction()がプログラムの実行中に数回呼び出されることです。私がPropertyChangedに割り当てるデリゲートは、このメソッドを通過する際に追加されますか? (より多くのメモリを消費する毎回の反復とプログラムの減速)またはコンパイラ/ランタイムは私が最初に追加する必要があることを理解するのに十分なスマートなのですか?もしそうなら、これはどのように機能しますか?

+0

これは問題ではないかもしれませんが、この構文では、このイベントから匿名イベントハンドラの登録を解除することができないため、メモリの問題が発生する可能性があります。私は、関数を書くことをお勧めし、ちょうど+ =新しいイベントハンドラ(関数)でイベントハンドラを添付します。 –

答えて

3

多くは、あなたがPropertyChangedイベントは、いくつかのリスナーを追加することを防止するnullあるかどうかを確認すべきであることを示唆しています。その解決策の問題点は、PropertyChangedは、nullである可能性があります。コードの他の部分が同じイベントをリッスンする場合は、このような別のプロパティーをリッスンします。

void AnotherFunction() 
{ 
    myClass.PropertyChanged += (s,e) => { 
    if (e.PropertyName == "anotherProperty") { 
     DoSomethingElse(myClass.anotherProperty); 
    } 
    } 
} 

よりよい解決策は、私の意見では、最初はfalse、およびMyFunctionが呼び出されたときにのみtrueに設定されているブールフラグを維持するだろう。次に、このフラグをチェックして、イベントハンドラを追加する必要があるかどうかを確認します。

+0

ありがとう、最も完全な答え –

4

コンパイラはあなたの意図を知ることができません...それは忠実にMyFunction()の各呼び出しでイベントハンドラを添付します。

このように見てください。コンパイラは、関数内の参照変数(例:myclass)がハンドラを以前にアタッチしたオブジェクトの同じインスタンスを参照していることを知ることができません。また、コール間でハンドラを別の場所に切り離さなかったことも知りません。このような仮定はできません。

ただし、ハンドラが1回だけ接続されるようにコードを再構成できます。他の消費者はPropertyChangedイベントを購読することができるので、あなたが購読しているかどうかを知るために、独立した州を維持する必要があります。例:他の回答の

if(!haveSubscribedToPropertyChanged) { 
    myClass.PropertyChanged += (s,e) => { 
      if (e.PropertyName == "myProperty") { 
       DoSomething(myClass.myProperty); 
      } 
     } 
     haveSubscribedToPropertyChanged = true; 
     } 
+0

ありがとうございます。ここでの問題は、myClassが他のメソッドからもアクセスできるシングルトンであることです。だから、他の人が代理人を追加することもあります。私もそれを見つける必要があります.. –

+0

コードの他の部分が同じイベントを使用して異なるプロパティの変更をリッスンする可能性があるため、nullをチェックするソリューションはPropertyChangedイベントで実行できません。私の答えは別の解決策を見てください:http://stackoverflow.com/questions/1158849/is-this-dangerous-about-events/1158930#1158930 –

+0

良い点。私は私の答えを改めるつもりです。 – LBushkin

関連する問題