それは、標準出力(OBJの送信者、EventArgsのargsを)署名でイベントハンドラデリゲートを作成するために、どのように間違っていますか?
質問
私はそれはあなたが簡単には古いデリゲート署名に基づいてされているすべての古い関係を壊してイベントを通過した情報に拡張することができますよう、標準のMSイベントハンドラデリゲートの署名を使用することのメリットを理解しています。
の人々は、このルールに従わない頻度を、実際に私は思ったんだけどありますか?私はこのような単純なイベントがあるとしましょう。
public event NameChangedHandler NameChanged;
public delegate void NameChangedHandler(Object sender, string oldName, string newName);
これは、単純なイベントだし、私は私は唯一の引数は、これまでNameChangedイベントから知っておく必要があるとしていることはほぼ正だ名前が変更されたオブジェクト、古い名前と新しい名前です。だから、それは別のNameChangedEventArgsクラスを作成する価値がある、またはこのような単純なイベントのためだけに、デリゲートの引数から直接引数を返すように、それが許容できるのですか?
解決
あなたは何も間違った方法を行うことができます。しかし、それは基準を学び、あなたが他の人とのコードに取り組んでいる良い習慣を保つように、それらに固執するのは悪い考えではありません。
だから私はあなたに取引をするでしょう。あなたはそれを正しい方法を行うことを約束した場合、私はあなたの痛みのそれははるかに少ない作ってあげるのコードスニペットを与えるでしょう。ただ、.snippetファイルでこれを入れて、中にそのファイルを置きます:
コードスニペット\ Visual Studioの2008 \マイドキュメントマイコードスニペット\
\ビジュアルC#\
(またはVisual Studio 2005の適用可能な場合)
そして、ここでは抜粋です。 ev2Genericを入力してタブを押すことでVSでそれを使用します:
<?xml version="1.0" encoding="utf-8" ?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
<CodeSnippet Format="1.0.0">
<Header>
<Title>Generic event with two types/arguments.</Title>
<Shortcut>ev2Generic</Shortcut>
<Description>Code snippet for event handler and On method</Description>
<Author>Kyralessa</Author>
<SnippetTypes>
<SnippetType>Expansion</SnippetType>
</SnippetTypes>
</Header>
<Snippet>
<Declarations>
<Literal>
<ID>type1</ID>
<ToolTip>Type of the first property in the EventArgs subclass.</ToolTip>
<Default>propertyType1</Default>
</Literal>
<Literal>
<ID>arg1Name</ID>
<ToolTip>Name of the first argument in the EventArgs subclass constructor.</ToolTip>
<Default>property1Name</Default>
</Literal>
<Literal>
<ID>property1Name</ID>
<ToolTip>Name of the first property in the EventArgs subclass.</ToolTip>
<Default>Property1Name</Default>
</Literal>
<Literal>
<ID>type2</ID>
<ToolTip>Type of the second property in the EventArgs subclass.</ToolTip>
<Default>propertyType2</Default>
</Literal>
<Literal>
<ID>arg2Name</ID>
<ToolTip>Name of the second argument in the EventArgs subclass constructor.</ToolTip>
<Default>property2Name</Default>
</Literal>
<Literal>
<ID>property2Name</ID>
<ToolTip>Name of the second property in the EventArgs subclass.</ToolTip>
<Default>Property2Name</Default>
</Literal>
<Literal>
<ID>eventName</ID>
<ToolTip>Name of the event</ToolTip>
<Default>NameOfEvent</Default>
</Literal>
</Declarations>
<Code Language="CSharp">
<![CDATA[public class $eventName$EventArgs : System.EventArgs
{
public $eventName$EventArgs($type1$ $arg1Name$, $type2$ $arg2Name$)
{
this.$property1Name$ = $arg1Name$;
this.$property2Name$ = $arg2Name$;
}
public $type1$ $property1Name$ { get; private set; }
public $type2$ $property2Name$ { get; private set; }
}
public event EventHandler<$eventName$EventArgs> $eventName$;
protected virtual void On$eventName$($eventName$EventArgs e)
{
var handler = $eventName$;
if (handler != null)
handler(this, e);
}]]>
</Code>
</Snippet>
</CodeSnippet>
</CodeSnippets>
他のヒント
あなたのイベントのためにEventHandler<T>
ジェネリックデリゲートを使用して、イベントデータを保持するためにEventArgs
から派生した型を作成します。常に、他の言葉でそう。それはあなたが常にそれはそうやったことがないですので、あなたはそれに遭遇したときにそれが動作する方法を正確に知っている何かます。
編集ます:
コード分析 CA1003:使用汎用イベントハンドラインスタンスの
コード解析 CA1009:正しくのイベントハンドラを宣言
実際には、多くの場合、どのように行う人[ありません ]のEventArgsに派生クラスを使用します。
私は、派生クラスのEventArgsが使用されていない時間に遭遇したことがありません。あなた自身を言うように、それは後にコードを変更するには、あなたの能力を向上させます。それは、このイベントハンドラであることを確認するのは簡単ですので、私はまた、読みやすさが向上していることを主張するだろう。
それは別々に作成する価値があります NameChangedEventArgsクラス、またはのために このような単純なイベントがそれです ただ戻ることが許容 直接の引数 デリゲートの引数?
あなたは、このようなインスタンスのためにそれを使用するよりのparamsでのイベントハンドラのためのEventArgsを使用していないだろうと言っているように見えます。 C#でプログラミングする場合正直なところ、それは単にオプションではありません。それはそれを失うのは簡単だところ一貫性など、特にこのようなフォーラムの、オープンソース・プロジェクトの今日の世界では、必見です。あなたは岩の下にこれをプログラミングしている確かならば、あなたが好きなようかもしれませんが、より大きなC#のコミュニティは基準に従い、特にあなたのコード内で一貫性をご利用いただき、誠にありがとうございます。