我在这里和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) 那么我正在阅读'Lambda表达式'主题(第17章;代表,C#代表语法糖).Jeffery表示C#编译器在后台创建一个新的非静态类,它具有以下内容:
我有以下两个问题:
我自己做了一些调试,看到如果Lambda Expression修改局部变量的值(在lambda Expresison正在使用的方法中定义),新值也会反映在表达式体外.考虑到表达式实际上是在另一个类中,这怎么可能?
为什么在静态类完全相同的情况下,发出的类需要是非静态的?
我希望这不是一个我无法理解的非常简单的概念.
如果我需要提供更多详细信息,请与我们联系.