在构造函数中注册事件?

时间:2011-12-09 12:20:30

标签: c# events constructor event-handling

我一直在玩代表,事件和匿名方法。在这样做时,一点变得非常明确。

它是否会简化在构造函数中注册任何事件方法或委托函数的过程?

我的测试显示它有效,它可以防止你在实例化后声明它们(因为对象的构造函数为你做了)。

事实上,表现非常好。在构造/实例化对象时使用“this”关键字引用当前对象有什么缺点吗?

这对我来说似乎很有意义,因为所有事件都会在实例化时被连接起来。

这可能是一个问题吗?

示例:

//Constructor
public SayHello() 
{
  _name = "Unnamed";
  _isUpdated = false;

  // Register event handler via lambda (ananymous method shorthand)
  this.NameChanged += (object sender, EventArgs e) => { Console.WriteLine(e.message)); };
}

2 个答案:

答案 0 :(得分:14)

这种方法存在一些潜在的问题。首先,在更一般的方面,出于性能原因,通常应该优先使用方法覆盖而不是订阅自发布事件。显然,如果事件由基于外部源的类公开,而该类暴露没有相应的可覆盖方法的事件,则这是不可能的。但是,订阅自行发布的事件应该是最后的手段,而不是默认方法。

第二个潜在问题更严重,但它与事件触发的代码有关,而不是哪个对象暴露事件。例如,请考虑以下构造函数:

public Foo(Bar bar)
{
    bar.SomeEvent += (s, e) => this.DoSomething();
}

如果bar在另一个线程上触发SomeEvent,则可以在实例完全初始化之前调用您的Foo实例的DoSomething方法。这是Java空间中一个记录良好的问题(例如,参见http://www.ibm.com/developerworks/java/library/j-jtp0618/index.html),但对于C#/ .NET,覆盖范围要大得多。 http://joeduffyblog.com/2010/06/27/on-partiallyconstructed-objects/为.NET提供了一些详细的介绍,但它可能比你想知道的更多......

答案 1 :(得分:1)

我认为没有任何问题。这取决于你这样做。您可以在其构造函数中使用对象本身。如果你省略this,它也会有用。