我有一个关于 .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
立即,这将在安全线程中完成this
对象通过m_TaskQueue
.
让我通过描述我们实际为此生成的代码来回答您的问题。我将重命名您名称混乱的其他 Invoke 方法;没有必要了解这里发生了什么。
假设你说
class C<T>
{
public T Value;
public void Invoke(Action<T> action)
{
Frob(() => action(this.Value));
}
public void Frob(Action action)
{ // whatever
}
}
编译器生成代码就像您实际编写的一样:
class C<T>
{
public T Value;
private class CLOSURE
{
public Action<T> ACTION;
public C<T> THIS;
public void METHOD()
{
this.ACTION(this.THIS.Value);
}
}
public void Invoke(Action<T> action)
{
CLOSURE closure = new CLOSURE();
closure.THIS = this;
closure.ACTION = action;
Frob(new Action(closure.METHOD));
}
public void Frob(Action action)
{ // whatever
}
}
这是否回答你的问题?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)