gpt4 book ai didi

c# - .NET : Is creating new EventArgs every time the event fires a good practice?

转载 作者:太空狗 更新时间:2023-10-29 18:30:30 24 4
gpt4 key购买 nike

比如我有一个基础事件发布方式:

    protected virtual OnSomeEvent(EventArgs e)
{
var handler = SomeEvent;
if (handler != null)
{
handler(this, e);
// handler(this, new EventArgs());// EDIT: Yes it should be
// handler(this, e),
// ignore this one :D
}
}

对于覆盖 OnSomeEvent 并在触发时引发附加事件的派生类:

    protected override OnSomeEvent(EventArgs e)
{
base.OnSomeEvent(e);

if (ExtendedEvent != null)
{
OnExtendedEvent(e);
}
}

protected void OnExtendedEvent(EventArgs e)
{
// some stuff done
// new information the ExtendedEventArgs object needs
// is not available until this point

ExtendedEvent(this, new ExtendedEventArgs(someStuff, someOtherStuff));
}

如果继续这样推导下去,它会为每一代需要它的派生类创建一个新的派生EventArgs。然而,似乎 .NET 框架上 EventArgs 的各种派生并不是设计为可变的(没有 setter),这不鼓励对象保留 EventArgs 的单个实例并随时修改它。

因此,每次触发此类事件时,它都会为所有涉及的 EventArgs 对象重新分配内存。在一个事件每秒可以触发几十次的图形密集型应用程序中(例如控件上的 OnPaint 事件),这真的是一个好习惯吗?

我是否应该对 OnExtendedEvent() 进行一些更改并使 ExtendedEventArgs 可变以便以下内容成为可能?

    protected ExtendedEventArgs extendedArgs = ExtendedEventArgs.Empty;
protected void OnExtendedEvent(EventArgs e)
{
// some stuff done
// new information the ExtendedEventArgs object needs
// is not available until this point

extendedArgs.someProperty1 = someStuff;
extendedArgs.someProperty2 = someOtherStuff;

ExtendedEvent(this, extendedArgs);
}

编辑:修复了示例代码,现在应该更清楚了。

最佳答案

首先,如果您只是忽略它,为什么要将 EventArgs 参数传递给您的触发方法?那是真正的浪费,但资源消耗问题比您的方法告诉其调用者的谎言要小。只需传递参数,您的触发方法可能无法访问相关信息来创建 EventArgs 对象:

protected virtual OnSomeEvent(EventArgs e)
{
var handler = SomeEvent;
if (handler != null)
{
handler(this, e);
}
}

那么,现在我们已经说得很清楚了,如果您的 EventArgs 对象没有任何有意义的信息可以告诉您的订阅者,只需使用 EventArgs.Empty,这就是它的用途。您可以为您的自定义 EventArgs 类遵循相同的模式,但老实说,您什么都不用担心。创建 EventArgs 对象永远不会成为您应用程序的瓶颈,如果是,您就会遇到设计问题。

关于c# - .NET : Is creating new EventArgs every time the event fires a good practice?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2159002/

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