2011-12-09 13 views
5

私は、デリゲート、イベント、および匿名メソッドを使用して遊んでいます。そうすることで、ある点が非常に明確になりました。コンストラクタ内にイベントを登録していますか?

イベントメソッドを登録するプロセスやコンストラクタ内の関数を委譲するプロセスを合理化しないでしょうか?

私のテストによれば、それは動作し、インスタンス化後に(オブジェクトのコンストラクタがそれを行うので)宣言する必要がなくなります。

実際、パフォーマンスはかなり良いです。オブジェクトを構築/インスタンス化する際に現在のオブジェクトを参照するために "this"キーワードを使用することには、何らかの欠点がありますか?

これは、すべてのイベントがインスタンス化されるので、私には非常に意味があるようです。

問題が発生する可能性のある領域はありますか?

例:

//Constructor 
public SayHello() 
{ 
    _name = "Unnamed"; 
    _isUpdated = false; 

    // Register event handler via lambda (ananymous method shorthand) 
    this.NameChanged += (object sender, EventArgs e) => { Console.WriteLine(e.message)); }; 
} 

答えて

12

このアプローチにはいくつかの潜在的な問題があります。まず、より一般的な側面では、パフォーマンス上の理由から、自己パブリッシュされたイベントにサブスクライブするよりも、メソッドのオーバーライドを使用するほうがよいでしょう。イベントが対応するオーバーライド可能なメソッドなしで公開される外部ソースベースのクラスによってイベントが公開されている場合は、明らかにこれは不可能です。しかし、自己発行のイベントを購読することは、デフォルトのアプローチではなく、最後の手段であるべきです。

第2の潜在的な問題はより深刻ですが、どのオブジェクトがイベントを公開するのではなく、イベントによってトリガされたコードと関係しています。バー火災が別のスレッドにSomeEvent場合は、インスタンスが完全に初期化される前

public Foo(Bar bar) 
{ 
    bar.SomeEvent += (s, e) => this.DoSomething(); 
} 

、あなたのFooのインスタンスのdoSomethingのメソッドを呼び出すことができます。たとえば、次のコンストラクタを考えます。これは、Java空間でかなりよく文書化されている問題です(例えば、http://www.ibm.com/developerworks/java/library/j-jtp0618/index.htmlを参照)。しかし、C#/ .NETのカバレッジは非常に希薄です。 http://www.bluebytesoftware.com/blog/2010/06/27/OnPartiallyconstructedObjects.aspxは.NETの詳細なカバーを提供していますが、あなたが知りたいと思っている以上のものかもしれません...

+0

ニコール、優れた点。これはまさに私が探していたものです。私の欠点は、追加された簡素化が問題になる可能性がある(つまり、投稿)ということです。テストではうまくいくかもしれませんが、生産上、マーフィーの法律が効力を発揮します。確率的に起こることは十分な時間が与えられます。これを考えると、問題のアプリがマルチスレッド化されている場合(サービスやウェブポータルなど)、ある時点で競合が発生する可能性があります。ありがとうございました。 – Qubits

1

私はすべての問題があるとは思いません。そのようにするのはあなた次第です。コンストラクタでオブジェクト自体を使用できます。 thisを省略すると、それも機能します。

+0

これは私が考えたものです。私は、オブジェクトがすべてのコードをインスタンス化することができるという条件で、クライアント側でイベントを宣言しなければならないということを非常に手にしています。それは、考えられる潜在的な落とし穴を探していただけだ。これまでのところ、私はメモリ使用以外のものは見当たりませんでした(イベントが関係ない場合には最小の懸念事項)。 – Qubits

関連する問題