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#代表,参考解析时间》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

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

Kotlin实战

Kotlin实战

【美】Dmitry Jemerov(德米特里·詹莫瑞福)、【美】 Svetlana Isakova(斯维特拉娜·伊凡诺沃) / 覃宇、罗丽、李思阳、蒋扬海 / 电子工业出版社 / 2017-8 / 89.00

《Kotlin 实战》将从语言的基本特性开始,逐渐覆盖其更多的高级特性,尤其注重讲解如何将 Koltin 集成到已有 Java 工程实践及其背后的原理。本书分为两个部分。第一部分讲解如何开始使用 Kotlin 现有的库和API,包括基本语法、扩展函数和扩展属性、数据类和伴生对象、lambda 表达式,以及数据类型系统(着重讲解了可空性和集合的概念)。第二部分教你如何使用 Kotlin 构建自己的 ......一起来看看 《Kotlin实战》 这本书的介绍吧!

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

RGB HEX 互转工具

html转js在线工具
html转js在线工具

html转js在线工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具