我正在读这本书,我被困在这里:
public static class EventArgExtensions {
public static void Raise<TEventArgs>(this TEventArgs e,
Object sender, ref EventHandler<TEventArgs> eventDelegate)
where TEventArgs : EventArgs {
// Copy a reference to the delegate field now into a temporary field for thread safety
EventHandler<TEventArgs> temp =
Interlocked.CompareExchange(ref eventDelegate, null, null);
// If any methods registered interest with our event, notify them
if (temp ! = null) temp(sender, e);
}
}
特别是MSDN文档说
public static object CompareExchange(ref object location1, object value, object comparand)
System.Threading.Interlocked
的成员要点:
比较两个对象以获得引用相等性,如果它们相等,则替换其中一个对象。参数:
location1 :与comparand进行比较并可能被替换的目标对象 value :如果比较结果相等,则替换目标对象的对象 comparand :与location1上的对象进行比较的对象。返回:
location1中的原始值。例外:
System.ArgumentNullException:location1的地址是空指针。
这意味着这是错误的:
EventHandler<TEventArgs> temp =
Interlocked.CompareExchange(ref eventDelegate, null, null);
// If any methods registered interest with our event, notify them
if (temp ! = null) temp(sender, e);
因为我需要检查传递到CompareExchange的内容而不是输出。
我错过了什么吗?
答案 0 :(得分:8)
不,代码很好。它实际上只是执行易失性读取的一种方式。如果用null替换null,它将只返回null - 即如果eventDelegate
为空。