gpt4 book ai didi

c# - 在 C# 事件处理程序中,为什么 "sender"参数必须是一个对象?

转载 作者:IT王子 更新时间:2023-10-29 03:41:54 24 4
gpt4 key购买 nike

根据 Microsoft event naming guidelines ,C# 事件处理程序中的 sender 参数“始终是对象类型,即使可以使用更具体的类型也是如此”。

这会导致大量事件处理代码,例如:

RepeaterItem item = sender as RepeaterItem;
if (item != null) { /* Do some stuff */ }

为什么公约建议不要声明具有更具体类型的事件处理程序?

MyType
{
public event MyEventHander MyEvent;
}

...

delegate void MyEventHander(MyType sender, MyEventArgs e);

我是不是漏掉了什么?

<子>对于后代:我同意答案中的一般观点,即约定 使用对象(并通过 EventArgs 传递数据),即使可以使用更具体的类型,在实际编程中,遵循约定很重要。

编辑:搜索诱饵:RSPEC-3906 规则“事件处理程序应具有正确的签名”

最佳答案

嗯,这是一种模式而不是规则。它确实意味着一个组件可以转发另一个组件的事件,保留原始发送者,即使它不是引发事件的正常类型。

我同意这有点奇怪 - 但为了熟悉起见,坚持惯例可能是值得的。 (对其他开发人员来说很熟悉。)我从来没有特别热衷于 EventArgs。我自己(鉴于它本身不传达任何信息)但这是另一个话题。 (至少我们现在有 EventHandler<TEventArgs> - 尽管对于只需要传播单个值的常见情况,如果还有一个 EventArgs<TContent> 会有所帮助。)

编辑:它确实使委托(delegate)更通用,当然 - 单个委托(delegate)类型可以在多个事件中重复使用。我不确定我是否认为这是一个特别好的理由 - 特别是考虑到泛型 - 但我想这是某事......

关于c# - 在 C# 事件处理程序中,为什么 "sender"参数必须是一个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1437699/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com