我有一个关于 .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_TaskQueue
在5分钟后执行它,则其值将不会处于最新状态,而是处于首次引用时的状态。 - 按引用传递(引用类型) - 然后在执行操作期间将引用到
Value
的最新状态,但如果在执行操作之前将this.Value
更改为另一个引用,则仍将指向旧引用 - 按名称传递(两者皆可) - 在调用操作时将评估
this.Value
。我相信实际实现将持有对this
的引用,然后在委托的实际执行期间在其中评估Value
,因为没有按名称调用。
我认为它应该是按名称调用风格,但找不到任何文档,所以想知道它是否是一种明确定义的行为。这个类有点像Scala或Erlang中的Actor,因此我需要它是线程安全的。我不希望 Invoke
函数立即取消引用 Value
,这将由 m_TaskQueue
为 this
对象在一个安全的线程中完成。