C#匿名值类型性质

Den*_*lod 2 c# anonymous-types immutability

考虑流动的代码片段

static void Main()
    {
        var x = new MyStruct
        {
            Item = new StringWrapper("abc")
        };

        Console.WriteLine(x.Item.PublicField);
        x.Item.SetValue("xyz");
        Console.WriteLine(x.Item.PublicField);

        var y = new
        {
            Item = new StringWrapper("abc")
        };

        Console.WriteLine(y.Item.PublicField);
        y.Item.SetValue("xyz");
        Console.WriteLine(y.Item.PublicField);
    }

    public struct MyStruct
    {
        public StringWrapper Item;
    }

    public struct StringWrapper
    {
        public string PublicField;

        public StringWrapper(string v)
        {
            PublicField = v;
        }

        public void SetValue(string v)
        {
            PublicField = v;
        }
    }
Run Code Online (Sandbox Code Playgroud)

输出:
abc
xyz
abc
abc

MyStruct可以声明为类,输出将保持不变.{abc,abc}输出的一部分对我来说是一个惊喜,因为我希望将匿名类型转换为类或结构并且行为相同.

我觉得我在这里遗漏了一些明显的东西,并会感激任何帮助.

谢谢.

Mat*_*nen 5

这里的区别在于您的MyStruct(struct或class)公开了一个公共字段,而匿名classes(new { })公开了公共属性.

从字段或变量访问值类型时,如果没有副本,则直接访问该实例.因此,对其进行更改会将它们存储在实例中.

当您通过属性或方法访问它时,您将获得您的StringWrapper更改副本,并且不会更改匿名类私有字段中存储的内容.

只是为了演示,你也可以通过将你的Item字段作为属性来获得相同的行为:

public StringWrapper Item { get; set; }
Run Code Online (Sandbox Code Playgroud)