如何错的是它与超出标准(的OBJ发件人,EventArgs参数)签名创建一个事件处理程序委托?(Ho

2019-07-30 12:06发布

我明白使用标准的MS事件处理程序委托签名,因为它可以让你轻松的通过与出打破了基于旧的委托签名的任何旧关系的事件传递的信息扩大的好处。

我想知道是如何在实践中往往人们遵循这个规则? 说我有这样一个简单的事件

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

这是一个简单的事件,我几乎积极的,我曾经一往无前的唯一参数需要知道从NameChanged事件是其名称更改的对象,旧名称,新名称。 因此,它是值得的,创建一个单独的NameChangedEventArgs类,或者简单的这样的活动是可以接受,只是直接通过委托参数返回的参数?

Answer 1:

如果你是谁拥有对付它的唯一一个你可以做任何事情,走错了路。 但它不是一个坏主意,学习标准,并坚持给他们,让你保持良好的生活习惯,当你在代码的工作与他人。

所以,我会让你成为一个交易。 如果你答应做正确的方式,我给你的代码片段将使它更痛苦少。 只要把这个在一个是.snippet文件,并把该文件中:

我的文档\ Visual Studio 2008的\代码段\的Visual 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>


Answer 2:

使用EventHandler<T>泛型委托为您的活动,并创建派生类型EventArgs举办活动资料。 因此,换句话说,始终。 这件事情,你总是知道,当你遇到它,因为它从来没有做过,否则它是如何工作的。

编辑:

代码分析CA1003:使用通用的事件处理程序实例
代码分析CA1009:正确声明事件处理程序



Answer 3:

如何在实践中往往人[不使用EventArgs的派生类。

当EventArgs的派生类没有被使用我从未遇到过的时间。 至于你说的你自己,它会增加你日后更改代码的能力。 我也认为,可读性得到改善,因为它很容易看出这是一个事件处理程序。

是否值得创建一个单独的NameChangedEventArgs类,或者简单的这样的活动是可以接受的,只是通过委托参数直接返回的参数?

你好像说你会使用EventArgs的事件处理程序的更多PARAMS和不使用它像这样的情况。 老实说,这根本就不是一个选项,在C#编程时。 一致性是必须的,尤其是在当今世界论坛上的这个样子,开源项目等在那里很容易失去它的。 当然,如果你是一个岩石下编程这一点,你可以做任何你喜欢的,但更大的C#社区会感谢你对你的代码中使用的一致性以下标准和特别。



文章来源: How wrong is it to create an event handler delegate with out the standard (Obj sender, EventArgs args) signature?