相关疑难解决方法(0)

离散匿名方法共享一个类?

我在这里和Eric Lippert的Ref<T>班级玩了一下.我注意到在IL中看起来两个匿名方法都使用相同的生成类,即使这意味着类有一个额外的变量.

虽然只使用一个新的类定义似乎有点合理,但我觉得只<>c__DisplayClass2创建一个实例非常奇怪.这似乎暗示两个实例Ref<T>都引用相同的<>c__DisplayClass2 意思并不意味着y在收集之前无法vart1收集,这可能比joik返回之后发生得晚得多?毕竟,不能保证一些白痴不会写一个直接y通过vart1aftrer joik返回的函数(直接在IL中).也许这甚至可以通过反射而不是疯狂的IL来完成.

sealed class Ref<T>
{
    public delegate T Func<T>();
    private readonly Func<T> getter;
    public Ref(Func<T> getter)
    {
        this.getter = getter;
    }
    public T Value { get { return getter(); } }
}

static Ref<int> joik()
{
    int[] y = new int[50000];
    int x = 5;
    Ref<int> vart1 = new Ref<int>(delegate() { return x; });
    Ref<int[]> vart2 …
Run Code Online (Sandbox Code Playgroud)

c# delegates anonymous-methods

10
推荐指数
2
解决办法
830
查看次数

Lambda表达式:编译器行为

那么我正在阅读'Lambda表达式'主题(第17章;代表,C#代表语法糖).Jeffery表示C#编译器在后台创建一个新的非静态类,它具有以下内容:

  1. 用于存储已在Lambda表达式中访问的所有局部变量的字段.
  2. 一种方法,其正文包含Lambda表达式,其签名/返回类型与已使用Lambda Expressin的委托相匹配.

我有以下两个问题:

  1. 我自己做了一些调试,看到如果Lambda Expression修改局部变量的值(在lambda Expresison正在使用的方法中定义),新值也会反映在表达式体外.考虑到表达式实际上是在另一个类中,这怎么可能?

  2. 为什么在静态类完全相同的情况下,发出的类需要是非静态的?

我希望这不是一个我无法理解的非常简单的概念.

如果我需要提供更多详细信息,请与我们联系.

c# lambda

9
推荐指数
1
解决办法
215
查看次数

标签 统计

c# ×2

anonymous-methods ×1

delegates ×1

lambda ×1