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的局部变量,它也会这样做。

    09-29 23:56