举起事件似乎已经改变

本文关键字:改变 事件 | 更新日期: 2024-10-30 20:08:57

在以前版本的 .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;

并完全忽略该类。这是标准还是新事物?

举起事件似乎已经改变

我想

我知道你在说什么,是的,有一个变化。在 .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
)

唯一的区别是不再需要从EventArgs继承TEventArgs,因此现在可以这样做

public event EventHandler<string> NewTitle;

这将让订阅成员成为

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

而不是将一些带有您的标题的包装器EventArgs作为唯一的成员。

您的第一个示例没有多大意义,无法编译。您声明了两个具有相同名称的类型(委托和类都称为 NewTitleEventArgs ),这是不允许的。

第二个示例可编译且工作正常,它将在所有版本的 C# 中编译到 C# 1.0。但它不符合框架准则,所以你不应该写这样的代码。

符合模式是创建一个继承自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;

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

例如

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

公共事件新标题事件Args 新标题;

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