我经常看到这样的代码此处显示 http://msdn.microsoft.com/en-us/library/ak9w5846.aspx,即分配一个对象,然后将其用作“锁定对象”。
在我看来,您可以使用任何对象来实现此目的,包括事件本身作为锁定对象。为什么要分配一个不执行任何操作的新对象?我的理解是,在对象上调用 lock() 实际上并不会改变对象本身,也不会实际锁定它以使其不被使用,它只是用作多个锁定语句锚定的占位符。
public class Shape : IDrawingObject, IShape
{
// Create an event for each interface event
event EventHandler PreDrawEvent;
event EventHandler PostDrawEvent;
object objectLock = new Object();
// Explicit interface implementation required.
// Associate IDrawingObject's event with
// PreDrawEvent
event EventHandler IDrawingObject.OnDraw
{
add
{
lock (objectLock)
{
PreDrawEvent += value;
}
}
remove
{
lock (objectLock)
{
PreDrawEvent -= value;
}
}
}
}
所以我的问题是,这真的是一件好事吗?
包括事件本身
不,你不能那样做。 “事件”实际上只是一些访问器方法。假设您指的是支持委托,那将非常糟糕 - 委托是不可变的:每次添加/删除订阅者时,您都会得到一个不同的代表。
实际上,4.0 编译器现在使用无锁代码来完成此操作Interlocked
- 可能值得采用这种方法。
在你的例子中,objectLock
确保所有调用者(该实例)都锁定same对象,这很重要 - 但没有锁定的丑陋this
(这就是 C# 编译器的方式used上班)。
--
更新:您的示例显示了 C# 4.0 之前必需的代码,访问类似字段的事件inside类型直接与字段对话:不遵守正常的类字段事件锁定。这在 C# 4.0 中发生了变化;你现在可以(在 C# 4.0 中)safely将其重写为:
public class Shape : IDrawingObject, IShape
{
// Create an event for each interface event
event EventHandler PreDrawEvent;
event EventHandler PostDrawEvent;
event EventHandler IDrawingObject.OnDraw
{
add { PreDrawEvent += value; }
remove { PreDrawEvent -= value; }
}
}
然后遵循所有正确的行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)