提升事件似乎已经发生了变化

时间:2013-12-19 00:36:19

标签: c# .net events .net-4.5

在.NET的早期版本(我认为3)中,我使用类似这样的内容来提升自定义EventArgs

的事件
public delegate void NewTitleEventArgs(object sender, string title);
public event NewTitleEventArgs NewTitle;

public class NewTitleEventArgs : EventArgs //Class used to pass data to event consumers when sending notification.
{
    public readonly string NewTitle;
    public NewTitleEventArgs(string Title)
    {
        NewTitle = Title;
    }
} 

然而,我现在似乎只需要这样做:

public delegate void NewTitleEventArgs(object sender, string title);
public event NewTitleEventArgs NewTitle;

并完全忽略了这门课程。这是标准还是新事物?

3 个答案:

答案 0 :(得分:4)

我想我知道你在说什么,是的,有一个改变。在.NET 4.0及更早版本中,EventHandler<TEventArgs>的定义为

public delegate void EventHandler<TEventArgs>(
    Object sender,
    TEventArgs e
)
where TEventArgs : EventArgs

但是从.NET 4.5开始,定义更改为

public delegate void EventHandler<TEventArgs>(
    Object sender,
    TEventArgs e
)

唯一的区别是TEventArgs不再需要从EventArgs继承,所以现在可以做到

public event EventHandler<string> NewTitle;

哪个会让订阅成员

public void myObject_NewTitle(object sender, string title)
{
   //...
}

而不是让一些EventArgs包装器将其中的标题作为唯一成员。

答案 1 :(得分:1)

你的第一个样本没有多大意义,也不会编译。你声明了两个具有相同名称的类型(一个名为NewTitleEventArgs的委托和一个类),这是不允许的。

您的第二个示例编译并正常工作,它将在所有版本的C#中编译为C#1.0。但它不符合the framework guidelines,因此您不应该编写类似的代码。

符合模式是创建一个继承自EventArgs的类,并将其用作委托的第二个参数。

你会这样写(我还修复了代码中的其他一些样式问题):

public class NewTitleEventArgs : EventArgs
{
    public string NewTitle { get; private set; }

    public NewTitleEventArgs(string title)
    {
        NewTitle = title;
    }
} 

public delegate void NewTitleEventHandler(object sender, NewTitleEventArgs args);
public event NewTitleEventHandler NewTitle;

自C#2.0(2005年发布)以来,您还可以使用通用EventHandler<T>委托类型来避免为每个事件args类型声明新的委托类型:

public class NewTitleEventArgs : EventArgs
{
    public string NewTitle { get; private set; }

    public NewTitleEventArgs(string title)
    {
        NewTitle = title;
    }
} 

public event EventHandler<NewTitleEventArgs> NewTitle;

答案 2 :(得分:0)

你的第二个例子不是新的,它已经存在,第一个样本用于在你的委托上实现你自己的事件参数

e.g。

public delegate void NewTitleEventArgs(object sender, string title, myCustomArugment e);

公共事件NewTitleEventArgs NewTitle;

然后你需要实现自己的myCustomArugment事件参数