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

我知道一些差异,

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

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

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

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

以下是一些额外的差异:

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

正如Aaronaught和Eric博客文章所述:

记住规则,引用类型总是进入堆,而值类型总是去声明它们的位置? 如果在方法之外声明值类型,但在引用类型内,它将被放置在堆上的引用类型中。

我认为值是隐式分配的内存而不是引用类型,它们必须明确地分配内存