我知道struct是值类型而类是引用类型但是当我执行以下代码时为什么我得到两个不同的答案
任何人都可以解释一下
[struct|class] values {
public int x, y;
public values (int x, int y) {
this.x = x;
this.y = y;
}
}
values v = new values(12, 13);
object o = v;
v.x = 2;
Console.WriteLine(((values)o).x);
Run Code Online (Sandbox Code Playgroud)
输出
什么时候
它是类:输出是2
它是struct:输出是12
任何人都可以解释一下吗?
谢谢
对于struct或者class来说行为非常不同的一行
object o = v;
Run Code Online (Sandbox Code Playgroud)
何时Values是引用类型,o成为引用的副本v.仍然只有一个实例Values.
何时Values是值类型,o成为对实例本身的盒装副本的引用.在这种情况下,赋值会创建第二个实例,并v.x = 2在原始实例上执行.副本不受影响.
您的示例包括拳击,这是一个不必要的复杂功能,当您使用时,values o = v;您将获得相同的输出.然后该行创建一个没有装箱的普通副本(第二个实例).
总结一下:值和引用类型之间的主要区别在于复制语义.您会注意到简单赋值(x = y)和参数传递(foo(x))中的不同行为.
你可以期待陷阱有可变的值类型.作为练习,请参阅f.Myvalue.x = 2;与Values类或结构有关的内容
class Foo { public Values MyValue { get; set; } }
Run Code Online (Sandbox Code Playgroud)