Qub*_*its 6 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)); };
}
Run Code Online (Sandbox Code Playgroud)
Nic*_*oiu 15
这种方法存在一些潜在的问题.首先,在更一般的方面,出于性能原因,通常应该优先使用方法覆盖而不是订阅自发布事件.显然,如果事件由基于外部源的类公开,而该类暴露没有相应的可覆盖方法的事件,则这是不可能的.但是,订阅自行发布的事件应该是最后的手段,而不是默认方法.
第二个潜在问题更严重,但它与事件触发的代码有关,而不是哪个对象暴露事件.例如,请考虑以下构造函数:
public Foo(Bar bar)
{
bar.SomeEvent += (s, e) => this.DoSomething();
}
Run Code Online (Sandbox Code Playgroud)
如果bar在另一个线程上触发SomeEvent,则可以在实例完全初始化之前调用Foo实例的DoSomething方法.这是Java空间中一个记录完备的问题(例如,参见http://www.ibm.com/developerworks/java/library/j-jtp0618/index.html),但对于C#来说,覆盖范围更为稀疏/.净. http://joeduffyblog.com/2010/06/27/on-partiallyconstructed-objects/为.NET提供了一些详细的介绍,但它可能比你想知道的要多......
| 归档时间: |
|
| 查看次数: |
5636 次 |
| 最近记录: |