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