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

前端之家收集整理的这篇文章主要介绍了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.f2er.com/csharp/99059.html

猜你在找的C#相关文章