考虑流动的代码段
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可以声明为class,输出将保持不变。 {abc,abc}输出的一部分对我来说是一个惊喜,因为我希望将匿名类型转换为类或结构并且行为相同。
我觉得我在这里遗漏了一些明显的东西,并会感激任何帮助。
感谢。
答案 0 :(得分:5)
这里的区别在于,您的MyStruct
(结构或类)公开了一个公共字段,而匿名类(new { }
)公开了公共属性。
当您从字段或变量访问值类型时,如果没有副本,则直接访问该实例。因此,对它进行更改会将它们存储在实例中。
当您通过属性或方法访问它时,您将获得StringWrapper
的返回副本,并且更改它不会更改匿名类私有字段中存储的内容。
只是为了演示,您也可以通过将Item
字段设为属性来获得相同的行为:
public StringWrapper Item { get; set; }