【发布时间】:2010-02-16 22:42:09
【问题描述】:
我有一个关于 .net 代表的简单问题。假设我有这样的事情:
public void Invoke(Action<T> action)
{
Invoke(() => action(this.Value));
}
public void Invoke(Action action)
{
m_TaskQueue.Enqueue(action);
}
第一个函数包含对this.Value 的引用。在运行时,当第一个带有泛型参数的方法被调用时,它会以某种方式将this.Value 提供给第二个,但是如何呢?我想到了这些:
-
按值调用(结构) -
this.Value的当前值被传递,因此如果m_TaskQueue5 分钟后执行它,该值将不会处于其最近的状态,它将是任何那是第一次参考的时候。 -
通过引用调用(引用类型) - 然后在执行操作期间将引用
Value的最新状态,但如果我在执行操作之前将this.Value更改为另一个引用,它仍然是指向旧参考 -
按名称调用(两者) - 其中
this.Value将在调用操作时进行评估。我相信实际的实现将持有对this的引用,然后在委托的实际执行期间评估Value,因为没有按名称调用。
我认为这将是名称风格的呼唤,但找不到任何文档,因此想知道它是否是定义明确的行为。这个类有点像 Scala 或 Erlang 中的 Actor,所以我需要它是线程安全的。我不希望Invoke 函数立即取消引用Value,这将在this 对象的安全线程中由m_TaskQueue 完成。
【问题讨论】:
标签: c# .net multithreading delegates naming-conventions