在.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;
并完全忽略了这门课程。这是标准还是新事物?
答案 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事件参数