c#值类型与引用类型

一.引用类型与值类型

值类型是个轻量级类型,引用类型是个 '重量级‘类型。

值类型存放的是对象本身,而引用类型存放的对象存放的内存地址

1.内存分配

值类型 的实例一般在线程栈上分配, 引用类型的实例则在托管堆上分配。

注: 值类型的实例并不是一定在线程栈上,和定义的位置也有关系,局部变量和方法参数一定在栈上,但是类的成员变量总是会有类中的其他数据分配在一起,就有可能分配在堆上

C#同C/C++不同,c#是基于.net环境的,称之为托管。因为之前学的是C语言所以很不理解。

比如C语言中变量存放在 堆还是栈中并不是有变量类型来决定。 而是由定义变量的方式。栈中存放局部变量的值,系统进行内存分配回收。堆则是程序员创建,回收。

而在C#托管代码中变量存放内存的位置则不是根据定义变量的方式,他是由实例(C#中用变量类型有些欠妥,用对象实例比较精确点)类型决定的。

C/C++的 堆与栈区别

点击打开链接

点击打开链接


2. NET FRAMEWORK SDK 文档中已经指明了哪些是引用类型,哪些是值类型

值类型:值类型称为结构或枚举。struct ,Int32,Boolean,Decimal, 、这些结构都是从System.ValueType派生下来的。所有的枚举都是从System.Enum派生下来的

引用类型:类 都是引用类型


3.初始化

值类型变量创建的时候默认是个包含基础类型的值,所有成员被初始化为 0

引用类型变量创建的时候默认是null,表明没有指向一个有效的对象,如果直接使用,会抛出一个NullReferenceException的异常。

原文地址:https://www.cnblogs.com/stoneFang/p/6715325.html