C#代表,参考解析时间

栏目: C# · 发布时间: 7年前

内容简介:翻译自:https://stackoverflow.com/questions/2276962/c-sharp-delegates-reference-resolution-time

我有一个关于.net委托的简单问题.说我有这样的事情:

public void Invoke(Action<T> action)
    {
        Invoke(() => action(this.Value));
    }

    public void Invoke(Action action)
    {
        m_TaskQueue.Enqueue(action);
    }

第一个函数包含对this.Value的引用.在运行时,当第一个带有泛型参数的方法被调用时,它会以某种方式提供this.Value到第二个,但是如何?我想到了这些:

>按值调用(struct) – 传递this.Value的当前值,因此如果m_TaskQueue在5分钟后执行它,则该值将不会处于其最近状态,它将是第一次引用时的值.

>通过引用调用(引用类型) – 然后在执行操作期间引用最新的Value状态,​​但如果我在执行操作之前将this.Value更改为另一个引用,它仍将指向旧引用

>按名称调用(两者) – 在调用操作时将评估this.Value.我相信实际的实现将持有对此的引用,然后在实际执行委托期间评估该值,因为没有按名称调用.

我认为这将是名称样式的调用,但无法找到任何文档,所以想知道它是否是一个明确定义的行为.这个类类似于Scala或Erlang中的Actor,所以我需要它是线程安全的.我不希望Invoke函数立即取消引用Value,这将通过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
  } 
}

这是否回答你的问题?

翻译自:https://stackoverflow.com/questions/2276962/c-sharp-delegates-reference-resolution-time


以上所述就是小编给大家介绍的《C#代表,参考解析时间》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。

比特币

比特币

李钧、长铗 / 中信出版社 / 2014-1-1 / 39.00元

2009年,比特币诞生。比特币是一种通过密码编码,在复杂算法的大量计算下产生的电子货币。虽然是虚拟货币,比特币却引起了前所未有的全球关注热潮。 这一串凝结着加密算法与运算能力的数字不仅可以安全流通、换取实物,1比特币价值甚至曾高达8 000元人民币。有研究者认为比特币具备打破几千年来全球货币由国家垄断发行的可能性。在不经意间,比特币引起的金融新浪潮已悄然成型。 虚拟货币并不是新鲜事物,......一起来看看 《比特币》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

在线进制转换器
在线进制转换器

各进制数互转换器

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换