首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >拥有符合网络指导方针的事件有什么好处?

拥有符合网络指导方针的事件有什么好处?
EN

Stack Overflow用户
提问于 2010-02-17 17:49:20
回答 5查看 1K关注 0票数 8

我理解如何根据Net准则使用事件,但是使用这种模式有什么好处呢?

http://msdn.microsoft.com/en-us/library/aa645739%28VS.71%29.aspx

.NET框架指导原则指出,用于事件的委托类型应该包含两个参数,一个表示事件源的“对象源”参数,以及一个封装有关事件的任何附加信息的"e“参数。"e“参数的类型应该从EventArgs类派生。对于不使用任何附加信息的事件,.NET框架已经定义了适当的委托类型: EventHandler。

( a)我看到了使用“对象源”值作为第一个参数的一些好处,因为在某些情况下,多个对象可以将其事件设置为相同的方法。因此,例如,如果我们有10个对象,如果所有10个对象都将它们的事件设置为事件处理程序M,那么在M中,我们可以使用“对象发送方”参数值来标识事件调用的发起者。

  • ,但据我所知,只有在实例方法中引发事件时,“对象源”参数才是有用的。因此,如果在静态方法中引发事件,那么“对象源”参数就没有用?!

( b)按照净框架准则使用事件是否还有其他好处?

( c)不管好处是什么,他们为什么要把不得不这么做的麻烦看得更重呢?

EventArgs

  • write

  • 编写额外的代码,将所需的参数放入从EventArgs派生的对象中;在事件处理程序中编写额外的代码,从EventArgs ?

派生的对象中提取信息。

谢谢

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-02-17 17:55:01

据我所知,有两大好处:

使用事件编写代码的

  • 人员将识别该模式,并立即知道如何使用事件
  • ,该事件的签名是以对更改

非常健壮的方式构建的。

第一点应该是很明显的,不需要太多的阐述。

至于第二点,我认为有两个原因。首先,由于发送者是object,事件签名可以由几种类型重用。第二,由于第二个参数是EventArgs附件,所以当您引入自己的EventArgs类时,可以在不更改事件签名的情况下对该类进行扩展。

更新

对问题的答复:

我不知道你所说的“能够在不改变事件签名的情况下扩展EventArgs”是什么意思?!

让我们举一个例子,以下面的课为例:

代码语言:javascript
运行
复制
public class SomeClass
{
    public event EventHandler<FileEventArgs> SomethingHappened;
}
public class FileEventArgs : EventArgs
{
    public FileEventArgs(string filename)
    {
        Filename = filename;
    }
    public string Filename { get; private set; }
}

然后有一个侦听SomethingHappened事件的使用者:

代码语言:javascript
运行
复制
static void SomethingHappenedHandler(object sender, FileEventArgs e)
{
    // do something intelligent
}

现在,让我们说,我们想要扩展我们在事件中传输的信息,并提供有关文件发生了什么的信息:

代码语言:javascript
运行
复制
public enum WhatHappened
{
    Copy,
    Rename,
    Delete
}
public class FileEventArgs : EventArgs
{
    public FileEventArgs(string filename, WhatHappened whatHappened)
    {
        Filename = filename;
        WhatHappened = whatHappened;
    }
    public string Filename { get; private set; }
    public WhatHappened WhatHappened { get; private set; }
}

现在,如果我们选择将文件名作为事件本身中的参数发送,则需要通过添加另一个参数来更改事件签名,从而有效地破坏了侦听事件的所有代码。但是,由于我们在上面的代码中只是简单地向FileEventArgs类添加了另一个属性,所以签名保持不变,不需要更新侦听器(除非他们想使用新添加的属性,也就是说)。

如果事件是在静态方法中引发的,那么“对象源”参数就没用了吗?!!

是的,这是正确的。我通常将null作为来自static事件的发送方参数传递(老实说,这是非常罕见的)。

票数 10
EN

Stack Overflow用户

发布于 2010-02-17 17:56:48

如果您遵守.NET框架指导原则,不仅对于事件,而且对于任何事情,需要阅读您的代码或使用您的库的人都会识别它,从而使事情变得更简单。这总是一件好事,因为您应该为读者编写代码,而不是为了您的方便。.NET的好处是,从一开始就有一些标准准则,与C++等的数千种约定形成对比,而且大多数人都知道并应用它。

标准事件处理程序签名的另一个好处是,您可以将较不专门化的事件处理程序(例如,EventHandler)分配给更专业类型的事件,这样可以简化开发,如果某人不需要额外的数据。它还使通过反射添加事件处理程序变得更简单,这在某些情况下可能很有用(比如对象层次结构浏览器用于某些对象模型)--我可以向您保证,通过反射处理任何事件的代码是一件复杂的事情,我通过为每个事件释放IL代码来解决这个问题,我一直认为这是最后的手段。

正如Fredrik M rk在同一时间所写的,这使得以后只向EventArgs派生的类添加参数,而不是向每个事件处理程序添加参数来扩展事件变得更加容易。

票数 8
EN

Stack Overflow用户

发布于 2010-02-17 17:56:36

标准方法的主要好处之一是它能做它在锡上说的话。标准方法意味着,任何查看代码的开发人员都会立即了解正在发生的事情以及如何使用您的事件。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2283073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档