微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 使事件符合Net准则有什么好处?

我了解如何根据Net Framework指南使用事件,但使用此模式有什么好处?

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

The .NET Framework guidelines indicate that the delegate type used
for an event should take two parameters,an “object source” parameter
indicating the source of the event,and an “e” parameter that
encapsulates any additional information about the event. The type of
the “e” parameter should derive from the EventArgs class. For events
that do not use any additional information,the .NET Framework has
already defined an appropriate delegate type: EventHandler.

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

>但据我所知,“对象源”参数仅在事件方法中引发事件时才有用.因此,如果在静态方法中引发了事件,那么“对象源”参数是没有用的?!

b)根据Net Framework准则使用事件是否还有其他好处?

c)无论可能带来什么好处,为什么他们会超越必须的麻烦

>编写一个额外的代码,将所需的参数放入从EventArgs派生的对象中
>在事件处理程序中编写一个额外的代码,以从EventArgs派生的对象中提取信息?

谢谢

解决方法

据我所知,有两个主要好处:

>编写消耗该事件的代码的人将识别该模式并立即知道如何使用该事件
>活动的签名是以对变革有力的方式精心设计的

第一点应该是非常明显的,不需要太多详细说明.

至于第二点,有两个原因(在我看来).首先,由于发送者是对象,因此事件签名可以由几种类型重用.其次,由于第二个参数是EventArgs的后代,当您引入自己的EventArgs类时,可以在以后扩展此类,而不会更改事件的签名.

更新
回答问题:

I’m not sure what you mean by “ being
able to extend EventArgs without
altering the signature of the event”?!

我们举一个例子,参加以下课程:

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事件的消费者:

static void SomethingHappenedHandler(object sender,FileEventArgs e)
{
    // do something intelligent
}

现在,假设我们想要扩展我们在事件中传输的信息,并提供有关文件发生的信息:

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; }
}

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

Am I write in assuming that if event
is raised inside static method,then
“object source” parameter is of no
use?!

对,那是正确的.我通常传递null作为静态事件的发送者参数(老实说,这是非常罕见的).

原文地址:https://www.jb51.cc/csharp/99059.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐