2009-04-27 10 views
2

私はあなただけを提供する1つの方法を望む/期待していると仮定すると...ただ好奇心の問題としてそこC#のイベントやLambda?

これを投げていますが、これは悪い習慣時または眉をひそめたことでしょうか?

public class Something { 
    public Action OnRemove =() => { }; 
    public Action<object, EventArgs> OnFinishedLoading = (sender, e) => { }; 
} 

// then used like... 
something.OnRemove =() => { /*do something...*/ }; 
something.OnFinishedLoading = (sender, e) => { /*do something else...*/ }; 

私は、このイベントで不正行為のようなものです実現が、私はこのアプローチについて悪いものはありますか?長期的にはアプリケーションの潜在的な問題を引き起こすでしょうか?

複数のメソッドを実行したい場合は、イベントがうまくいくことがわかります。これは、主に1つのメソッドを欲しい/期待している場合の主な質問です。

+0

イベントを使用する方法に比べてこのアプローチを使用するメリットは何ですか。 – MichaC

+0

私が気づいていることは何もありません。これを行うには絶対に間違った方法であるのが主に興味があります。 – Hugoware

答えて

0

イベントでは、あなたがこれを行うことはできません。

something.OnRemove = null; 

をイベントは、あなたのラッパー、プロパティと属性を持つラッパーの種類を提供しますので、あなたは、デリゲートメソッドを超えるカプセル化を確保することができます。

+0

私が正しく覚えている場合を除き、ハンドラが割り当てられるまで、同じ状況に陥る可能性のあるイベントはnullです。 – Hugoware

6

よく分かりませんが、「間違っている」というのは、公開されているフィールドが公開されているということです。私は少なくともプロパティを使用していました - その時点で、イベントはおそらくもっと簡単になります。これは、プロパティよりも少ないコードで柔軟性を提供します(特定のデフォルト値で自動実装されたプロパティを使用できなかったためです)。

もう1つの方法は、コンストラクタでそれを取得し、プライベートの読み取り専用フィールドとして保持することです。それはおそらく私が本当にやりたいことです...本当にプロパティ/フィールドとしてアクションを公開する必要はありますか?

+0

フィールドを使用して、上記のサンプルのコードの長さを単純に短縮しました。 – Hugoware

+0

良い/悪い習慣について質問しているときは、間違いなく簡潔にするために故意に悪い練習をしないことをお勧めします。 –

1

この方法では何も問題はなく、私は非常に頻繁に使用します。シンプルなハンドラはシンプルなコードを持っています(これは良いことです)。

この方法の唯一の欠点は、この方法で作成されたハンドラを簡単に削除できないことです。通常、あなたは言うことができます

something.OnRemove -= SomeEvent; 

しかし、これはすべてのラムダ式では当てはまりません。テキストで等価なラムダ式はほぼ確実に別々の実装を持つため、イベントハンドラを追加したり削除したりする目的で一致しません。

たとえば、次のコードではハンドラを削除できません。

something.OnRemove +=() { MessageBox.Show("Removed!"); } 
something.OnRemove -=() { MessageBox.Show("Removed!"); } 

ただし、追加したい限り、これは問題ではありません。

1

潜在的にあなたが望む以上に露出します。通常、イベントはクライアントがイベントを返すMulticastDelegateの内容を検査することを許可しません。

1

私はこのアプローチがうまくいくと思います。それはデリゲートを宣言するためのちょっとした方法です(Actionファミリの定義を見てください)。