gpt4 book ai didi

c# - EventHandler 和 EventHandler

转载 作者:太空宇宙 更新时间:2023-11-03 17:24:06 27 4
gpt4 key购买 nike

我想问一下EventHandler之间的区别和 EventHandler<T> .

之前我实现了一个 EventHandler ,带有自定义 EventArgs,可以从用户控件传递到父页面。

我想我需要申请EventHandler< T > , 但是它可以通过使用 EventHandler 来实现. (事实上​​ ,当我尝试应用 EventHandler<T> 时出现了奇怪的错误,程序可以运行但错误显示在 IDE 中,我无法解决 [ C# Custom EventHandler ])

所以我想知道在什么情况下需要申请EventHandler < T >

public event EventHandler AppendProcess;
public event EventHandler<MyEventArg> AppendProcess;

---更新---这就是我在用户控件中调用事件的方式(正如我所说,我可以通过这样做将对象传递给父页面(尽管我不知道这样做是否正确)

if (AppendProcess == null) { }
else
AppendProcess(this, new Common.WinLose_ProgressStage(Common.WinLose_SP_Parameter.upper, displayLevel + 1,
(int)Common.WinLose_Level.lvChild4, thename, refundratio,
selfproportion, -1, -1, loadlevel, isPlayer, betsource, gamecategory, false));

最佳答案

EventHandler<T>只是一个通用的 EventHandler类型,这避免了您必须为每种 EventArgs 声明一个新的委托(delegate)类型你想使用。

考虑 Control.KeyPress 例如。它被声明为 KeyPressEventHandler 类型的事件.该代表刚刚声明为:

public delegate void KeyPressEventHandler(object sender, KeyPressEventArgs e)

如果EventHandler<T> (和泛型)在创建时就已经存在,事件可以声明为 EventHandler<KeyPressEventArgs>相反,保存委托(delegate)声明。有很多很多代表,就像EventHandler , 并且仅在第二个参数的类型上有所不同 - EventHandler<T>避免了这种冗余。

不,如果你没有你自己的习惯EventArgs子类,没有理由使用 EventHandler<T> ...但是如果你这样做,最好使用它,这样处理事件的方法会收到你的自定义 EventArgs以强类型方式子类化。

顺便说一句,您调用事件处理程序的方式不是线程安全的。另一个线程可以在您的无效性检查之后取消订阅最终事件处理程序。如果您使用的是 C# 5,则应将其编写为:

var handler = AppendProcess;
if (handler != null)
{
handler(this, new Common.WinLose_ProgressStage(...));
}

如果您使用的是 C# 6 或更高版本,则可以使用 null 条件运算符:

// If AppendProcess is null, the arguments won't even be evaluated
AppendProcess?.Invoke(this, new Common.WinLose_ProgressStage(...));

关于c# - EventHandler<T> 和 EventHandler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41239191/

27 4 0