繁体   English   中英

C#匿名值类型性质

[英]C# anonymous value types nature

考虑流动的代码片段

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的返回副本,并且进行更改不会更改匿名类私有字段中存储的内容。

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

public StringWrapper Item { get; set; }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM