C#中的值类型和引用类型有什么区别?

ACP*_*ACP 9 c# types reference

我知道一些差异,

  1. 值类型存储在堆栈中,其中引用类型存储在托管堆上.
  2. 值类型变量直接包含它们的值,其中引用变量仅包含对在托管堆上创建的对象的位置的引用.

我错过了还有其他的区别......如果是的话,他们是什么?

Aar*_*ght 21

请阅读:堆栈是一个实现细节,并且不要再重复使用堆栈分配是区分值类型与.NET中的引用类型的区别.CLR可以选择在任何想要的地方分配变量.

最重要的区别在于赋值语义.将值类型分配给变量(或将其作为参数传递给方法)时,将复制所有数据.分配引用类型时,仅复制引用 - 两个引用都指向内存中的同一对象实例.


Zai*_*sud 15

以下是一些额外的差异:

  1. 值类型不能继承,而引用类型可以
  2. 值类型作为结构实现,引用类型作为类实现
  3. 默认情况下,值类型不能分配实际空值(?语法是一种变通方法,但仍然不会产生真正的空值)
  4. 将值类型分配给另一个变量,或者将其作为方法中的参数传递,会复制它,而使用引用类型,变量表示对象的内存位置
  5. 结构声明显式无参数构造函数是编译时错误,但同样不适用于类
  6. 在结构中分配所有字段之前使用"this"对象是编译时错误,但同样的情况不适用于类
  7. 如果struct没有在其构造函数中完全分配所有属性,那么这是一个编译时错误,但同样的情况不适用于类