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

时间:2010-03-10 06:19:18

标签: c# reference types

我知道一些差异,

  1. 值类型存储在堆栈中,其中引用类型存储在托管堆上。
  2. 值类型变量直接包含它们的值,其中引用变量仅包含对在托管堆上创建的对象的位置的引用。
  3. 我错过了其他任何差异......如果是这样,他们是什么?

4 个答案:

答案 0 :(得分:21)

请阅读:The stack is an implementation detail,不要再重复使用堆栈分配是区分值类型与.NET中引用类型的区别。 CLR可以选择在任何地方分配变量。

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

答案 1 :(得分:15)

以下是一些额外的差异:

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

答案 2 :(得分:2)

如Aaronaught和Eric博客文章所述:

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

答案 3 :(得分:0)

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