C#匿名值类型性质

C#匿名值类型性质,c#,immutability,anonymous-types,C#,Immutability,Anonymous Types,考虑流动的代码片段 static void Main() { var x = new MyStruct { Item = new StringWrapper("abc") }; Console.WriteLine(x.Item.PublicField); x.Item.SetValue("xyz"); Console.WriteLine(x.Item.PublicFi

考虑流动的代码片段

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;
        }
    }
输出:
abc
xyz
abc
abc

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

我觉得我在这里遗漏了一些明显的东西,我会感谢你的帮助


谢谢。

这里的区别是您的
MyStruct
(结构或类)公开公共字段,而匿名类(
new{}
)公开公共属性

从字段或变量访问值类型时,不会获得副本,而是直接访问实例。因此,对其进行更改会将其存储在实例中

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

为了演示,您可以通过将
字段也设置为属性来获得相同的行为:

public StringWrapper Item { get; set; }

,您可以通过搜索找到更多解释-
类StringWrapper
将解决此问题。必须提到匿名类型的属性是只读的