C# 匿名值类型性质

本文关键字:类型 | 更新日期: 2023-09-27 18:37:21

考虑流动的代码片段

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;
        }
    }

和输出:

美国广播公司xyz

美国广播公司美国广播公司

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

我觉得我在这里错过了一些明显的东西,并将不胜感激任何帮助。

谢谢。

C# 匿名值类型性质

这里的

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

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

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

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

public StringWrapper Item { get; set; }