C# 在构造函数中注册事件?

C# 在构造函数中注册事件?,c#,events,constructor,event-handling,C#,Events,Constructor,Event Handling,我一直在玩弄委托、事件和匿名方法。在这样做的过程中,有一点变得非常清楚 它不会简化在构造函数中注册任何事件方法或委托函数的过程吗 我的测试表明它是有效的,它可以防止您在实例化之后必须声明它们(就像对象的构造函数为您所做的那样) 事实上,性能相当不错。在构造/实例化对象时,使用“this”关键字引用当前对象是否有任何缺点 这对我来说似乎很有意义,因为所有的事件都是通过实例化连接起来的 是否存在这可能是一个问题的任何领域 例如: //Constructor public SayHello() {

我一直在玩弄委托、事件和匿名方法。在这样做的过程中,有一点变得非常清楚

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

我的测试表明它是有效的,它可以防止您在实例化之后必须声明它们(就像对象的构造函数为您所做的那样)

事实上,性能相当不错。在构造/实例化对象时,使用“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)); };
}

我认为没有任何问题。你可以用那种方式做。您可以在其构造函数中使用对象本身。如果您省略
这个
,,它也会起作用。这种方法有几个潜在的问题。首先,从更一般的角度来看,出于性能原因,通常应该倾向于使用方法覆盖而不是订阅自发布的事件。显然,如果事件是由一个基于外部源代码的类公开的,而该类公开的事件没有相应的可重写方法,则这是不可能的。然而,订阅自发布的事件应该是最后的手段,而不是默认的手段

第二个潜在问题更为严重,但它与事件触发的代码的作用有关,而与哪个对象公开事件无关。例如,考虑下面的构造函数:

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

如果bar在另一个线程上触发SomeEvent,则可以在实例完全初始化之前调用Foo实例的DoSomething方法。这在Java空间中是一个有相当多文档记录的问题(例如,请参见),但是C#/.NET的覆盖范围要少得多。提供了一些关于.NET的详细介绍,但可能比您想知道的要多…

我就是这么想的。我发现必须在客户端声明事件是非常“不”的(因为对象可以实例化所有代码)。也就是说,只是在寻找潜在的陷阱。到目前为止,我还没有遇到任何。。。除了内存使用(只有在事件不相关时才考虑最小问题)。Nicole,非常好。这正是我想要的。我的直觉告诉我,增加的简化可能会有问题(因此这篇文章)。在测试中,事情可能会很顺利,但在制作中,墨菲定律将会生效。。。很可能,任何可能发生的事情都会有足够的时间。有鉴于此,如果您所述的应用程序是多线程的(例如,服务或Web门户),那么竞争竞争将在某个时间点发生。非常感谢。