struct SomeStruct
{
public int Num { get; set; }
}
class Program
{
static Action action;
static void Foo()
{
SomeStruct someStruct = new SomeStruct { Num = 5 };
action = () => Console.WriteLine(someStruct.Num);
}
static void Main()
{
Foo();
action.Invoke();
}
}
来自标准的引用将不胜感激。任何相关的在线文章也是如此。
最佳答案
将没有副本。 Lambda捕获变量,而不是值。
您可以使用Reflector来查看编译代码:编译器会将“someStruct”变量移到帮助程序类中。
private static void Foo()
{
DisplayClass locals = new DisplayClass();
locals.someStruct = new SomeStruct { Num = 5 };
action = new Action(locals.b__1);
}
private sealed class DisplayClass
{
// Fields
public SomeStruct someStruct;
// Methods
public void b__1()
{
Console.WriteLine(this.someStruct.Num);
}
}
复制结构永远不会导致用户定义的代码运行,因此您无法真正通过这种方式对其进行检查。
实际上,在分配给“someStruct”变量时,该代码将进行复制。即使对于没有任何lambda的局部变量,它也会这样做。