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 时是否创建了 someStruct 的副本?
- 是否在 Foo 返回时创建了 someStruct 的副本?
- 我可以验证没有发生复制吗?在 C++ 中,我会实现复制构造函数并从其中打印。
对标准的引用将不胜感激。任何相关的在线文章。
最佳答案
不会有副本。 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 的局部变量,它也会这样做。
关于c# - 将值类型捕获到 lambda 时是否执行复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1982125/