gpt4 book ai didi

C# 匿名值类型本质

转载 作者:行者123 更新时间:2023-12-03 21:56:03 24 4
gpt4 key购买 nike

考虑流动的代码片段

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(结构或类)公开公共(public)字段,而匿名类 (new { }) 公开公共(public)属性。

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

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

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

public StringWrapper Item { get; set; }

关于C# 匿名值类型本质,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35803370/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com