C# 结构和类变量值

标签 c# class 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);

输出

  1. 类:输出为2

  2. 它是 struct :output is 12

谁能解释一下?

谢谢

最佳答案

对于 structclass 行为非常不同的一行是

  object o = v;
  • Values 是引用类型时,o 成为引用 v 的副本。 Values 仍然只有 1 个实例。

  • Values 是值类型时,o 成为对实例本身的盒装副本的引用。在这种情况下,赋值创建了第二个实例,您在原始实例上执行 v.x = 2。副本不受影响。

您的示例包括装箱,这是不必要的复杂化,当您使用 values o = v; 时,您将获得相同的输出。然后该行创建一个没有装箱的普通副本(第二个实例)。

总结一下:值和引用类型之间的主要区别在于复制语义。您会注意到简单赋值 (x = y) 和参数传递 (foo(x)) 中的不同行为。

您可能会遇到可变值类型的问题。作为练习,看看 f.Myvalue.x = 2;Values 做了什么作为类或结构与

 class Foo { public Values MyValue  { get; set; } }

关于C# 结构和类变量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18231567/

相关文章:

c# - 沙盒 AppDomain 中的线程安全

C# - 用于 Windows 窗体应用程序位图的 SetPixel 和 GetPixel 的更快替代方案

java - 如果抽象类不能实例化,具体是什么代码: ABS clsAbs = new ABS () {

php - 在类中定义变量并在函数中使用它

c++ - 使用头文件中定义的结构作为函数参数时,“不允许使用不完整的类型”

c - 在处理 C 结构数组时,(*(data+i)).member 是否与 data[i].member 相同?

c - 如何根据成员名称在 C 中初始化结构体

c# - 在 Simple Injector v3.0.3 中使用 ResolveUnregisteredType 会导致 Torn Lifestyle 警告

python - 从类方法内部更改全局变量

c# - 多少个客户端可以连接到一个 TCP 端口