2010-03-10 49 views
8

我知道有一些差别,C#中值类型和引用类型之间有什么区别?

  1. 值类型的存储位置作为参考类型存储在托管堆上在栈上。
  2. 值类型变量直接包含其值,其中作为参考变量仅保持到被托管堆上创建的对象的位置的参考。

是否有任何其他区别,我错过......如果是这样,它们是什么?

+8

问了很多次了,所以...... – 2010-03-10 06:20:53

+0

@Wheat,快速搜索,不,这个问题没有被问到或直接回答。 – strager 2010-03-10 06:22:50

+3

我没有时间在此刻完全回答这个问题 - 但我只是想指出,“值类型存储在堆栈上”是言过其实。请参阅http://pobox.com/~skeet/csharp/memory.html。有关引用类型与值类型的更多信息,请参阅http://pobox.com/~skeet/csharp/references.html – 2010-03-10 06:25:25

回答

21

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

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

+0

有点粗俗,但嘿,这是我学到的最好的方式,就像你对甘道夫生气并等待他用他的声音向你解释给你带来的烦恼一样,它倾向于坚持= d – Coops 2012-11-19 15:54:15

2

正如Aaronaught和Eric的博客文章中提到:

记住的规则,引用类型总是去堆,而值类型总是去他们宣称在哪里呢?如果值类型在方法之外声明,但在引用类型内部,它将被放置在堆中的引用类型中。

0

我觉得值隐含分配内存,但不引用它们必须被分配内存类型明确

14

这里有一些额外的差异:

  1. 值类型不能被继承,而引用类型可以
  2. 值类型实现为一个结构,引用类型为一类
  3. 值类型,默认情况下,不能分配实空值(?语法是一种变通方法,仍然不会导致真正的空值)
  4. 将值类型赋值给另一个变量,或者将其作为参数传递给方法中的一个参数,然后使用引用类型变量表示对象的内存位置
  5. 它是一个编译 - 结构声明一个明确的无参数构造函数的时间错误,但同样不适用于一个类
  6. 在结构中分配所有字段之前使用“this”对象时出现编译时错误,但是同样不适用于类
  7. 结构未在其构造函数中完全分配所有属性时出现编译时错误,但同样不适用于类
相关问题