13

標準の MS イベント ハンドラー デリゲート シグネチャを使用する利点を理解しています。これにより、古いデリゲート シグネチャに基づく古い関係を壊すことなく、イベントを介して渡される情報を簡単に拡張できるからです。

私が疑問に思っているのは、実際に人々がこのルールをどのくらいの頻度で守っているかということです。このような単純なイベントがあるとします

public event NameChangedHandler NameChanged;
public delegate void NameChangedHandler(Object sender, string oldName, string newName);

これは単純なイベントであり、NameChanged イベントから知る必要がある唯一の引数は、名前が変更されたオブジェクト、古い名前、および新しい名前であるとほぼ確信しています。別の NameChangedEventArgs クラスを作成する価値はありますか?それとも、このような単純なイベントの場合、デリゲート引数を介して引数を直接返すだけでよいのでしょうか?

4

3 に答える 3

10

イベントにジェネリック デリゲートを使用し、EventHandler<T>派生型を作成しEventArgsてイベント データを保持します。つまり、常に。それ以外の方法で行われることは決してないため、これに出くわしたときに、それがどのように機能するかを常に正確に知っているものです.

編集:

コード分​​析CA1003: 汎用イベント ハンドラー インスタンスを使用する
コード分析CA1009: イベント ハンドラーを正しく宣言する

于 2009-07-21T03:04:37.613 に答える
6

あなただけがそれに対処しなければならない場合、あなたは何でも間違った方法で行うことができます. しかし、標準を学び、それに固執することは悪い考えではありません。そうすれば、他の人とコードを作業するときに良い習慣を保つことができます。

だから私はあなたに取引をします。正しい方法で行うと約束していただければ、作業を大幅に軽減するコード スニペットを提供します。これを .snippet ファイルに入れて、そのファイルを次の場所に配置します。

My Documents\Visual Studio 2008\Code Snippets\Visual C#\My Code Snippets\
(または該当する場合は Visual Studio 2005)

そして、これがスニペットです。ev2Generic と入力して Tab キーを押すと、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>
于 2009-07-21T03:08:52.597 に答える
4

実際には、[EventArgs 派生クラスを使用しない] 頻度はどれくらいですか。

EventArgs 派生クラスが使用されていないときは一度もありません。ご自身でおっしゃるように、後でコードを変更する能力が向上します。また、これがイベント ハンドラーであることが簡単にわかるため、読みやすさが向上したとも言えます。

別の NameChangedEventArgs クラスを作成する価値はありますか?それとも、このような単純なイベントの場合、デリゲート引数を介して引数を直接返すだけでよいでしょうか?

より多くのパラメーターを持つイベントハンドラーには EventArgs を使用し、このようなインスタンスには使用しないと言っているようです。正直なところ、C# でプログラミングする場合、これは選択肢ではありません。一貫性は必須です。特に、このようなフォーラムやオープン ソース プロジェクトなど、簡単に失われがちな今日の世界では、一貫性が不可欠です。確かに、これをロックの下でプログラミングしている場合は、好きなことをしてかまいませんが、より大きな C# コミュニティは、標準に従い、特にコードの一貫性を使用することに感謝します。

于 2009-07-21T03:15:38.857 に答える