C#中的值类型和引用类型有什么区别?
我知道一些差异,
- 值类型存储在堆栈中,其中引用类型存储在托管堆上。
- 值类型变量直接包含它们的值,其中引用变量仅包含对在托管堆上创建的对象的位置的引用。
我错过了还有其他的区别……如果是的话,他们是什么?
请阅读: 堆栈是一个实现细节 ,不要再重复使用堆栈分配是区分值类型与.NET中的引用类型的区别。 CLR可以选择在任何想要的地方分配变量。
最重要的区别在于赋值语义。 将值类型分配给变量(或将其作为参数传递给方法)时,将复制所有数据。 分配引用类型时,仅复制引用 – 两个引用都指向内存中的同一对象实例。
以下是一些额外的差异:
- 值类型不能被inheritance,而引用类型可以
- 值类型作为结构实现,引用类型作为类实现
- 默认情况下,值类型不能分配实数空值(?语法是一种变通方法,但仍然不会产生真正的空值)
- 将值类型分配给另一个变量,或将其作为参数传递给方法,会复制它,而使用引用类型,变量表示对象的内存位置
- 结构声明显式无参数构造函数是编译时错误,但同样不适用于类
- 在结构中分配所有字段之前使用“this”对象是编译时错误,但同样的情况不适用于类
- 如果结构没有在其构造函数中完全分配所有属性,那么这是一个编译时错误,但同样的情况不适用于类
正如Aaronaught和Eric博客文章所述:
记住规则,引用类型总是进入堆,而值类型总是去声明它们的位置? 如果在方法之外声明值类型,但在引用类型内,它将被放置在堆上的引用类型中。
我认为值是隐式分配的内存而不是引用类型,它们必须明确地分配内存