举起事件似乎已经改变
本文关键字:改变 事件 | 更新日期: 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 事件参数