【发布时间】:2019-10-10 20:04:23
【问题描述】:
我正在尝试正确理解 Events 和 EventArgs,但无法完全了解整个 EventArgs.Empty 属性。
EventArgs 实现:
public static readonly EventArgs Empty;
并允许我们创建一个EventHandler 并使用以下方式调用它:
public event EventHandler<EventArgs> TestHappening;
private void MyMethod()
{
TestHappening( this, EventArgs.Empty );
}
现在我研究了许多基于 EventArgs 的类,但似乎没有一个类实现了这一点,所以即使我已经阅读了我能找到的所有关于 EventArgs.Empty 的文档,我还是有点盲目。根据文档,“Empty 的值是 EventArgs 的只读实例,相当于调用 EventArgs 构造函数的结果”。
基于此,我创建了以下实现:
public class TestEventArgs : EventArgs
{
public static readonly TestEventArgs Empty;
public bool UpdatedValue { get; private set; }
TestEventArgs()
: this( false )
{
}
public TestEventArgs( bool updatedValue )
{
this.UpdatedValue = updatedValue;
}
}
public event EventHandler<TestEventArgs> TestHappening;
private void MyMethod()
{
TestHappening( this, EventArgs.Empty );
}
使用TestEventArgs.Empty 是在实例化一个类还是它到底在做什么?
另外,即使我检查的所有子类都没有使用Empty,它们仍然可以使用它,暴露一个不可用的属性不是很混乱吗?
最后,根据我研究的各种文档,实际实例化EventArgs 的时间有两个主要差异。哪个被认为“更”正确?:
OnTestHappening( new TestEventArgs( false ) );
private void OnTestHappening( TestEventArgs e )
{
var handler = TestHappening;
if ( handler != null )
handler( this, e );
}
对
OnTestHappening( true );
private void OnTestHappening( bool foo )
{
var handler = TestHappening;
if ( handler != null )
handler( this, new TestEventArgs( foo ) );
}
【问题讨论】:
-
EventArgs 类被设计为一个基类。对于实际上具有有用属性的更专业的事件类。你不知道有一天你可能需要这样的课程。因此,您从 EventArgs 开始,可以非常轻松地更改它,而不会破坏任何事件处理程序。在那一天到来之前,您需要传递一个 EventArgs 实例。您可以使用
new EventArgs()但这很浪费,EventArgs.Empty 是一个便宜的替代品。 -
一开始就拥有这个类的“空”实例甚至没有意义。创建此类时,您应该期望人们在创建实例时实际提供布尔值,而不是使用默认值。
-
@Servy :我同意,我只是想完全理解它是如何工作的,并想如果我像以前那样把它分解,有一天它可能会帮助其他一些迷失的灵魂:)
-
@Storm 了解如何实现在您尝试实现它的上下文中没有意义的东西并不是教您如何正确使用该技术.如果你想学习如何使用一种技术,你应该在它是适合工作的工具的环境中使用它。