c# - 将值类型捕获到 lambda 时是否执行复制?

标签 c# .net struct value-type

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();
    }
}
  1. 创建 lambda 时是否创建了 someStruct 的副本?
  2. 是否在 Foo 返回时创建了 someStruct 的副本?
  3. 我可以验证没有发生复制吗?在 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/

相关文章:

c# - 如何将对象附加到 URL

c# - 如何从另一个目录中找到 C# 中的主文件夹?

c# - 您可以使用特定类型的类来子类化泛型类吗?

c# - 为纸牌分配号码

c# - 将 DateTime 转换为特定格式

c - 如何在C中的struct中添加元素

C - 如何完全释放结构数组单元格

c - 将 union 与结构一起使用

c# - .Net 安装项目中的自定义对话框

c# - Winforms/WPF 应用程序支持彩色表情符号吗?