前言
在C#中,数据类型可以分为以下几种类型:
值类型(Value types)引用类型(Reference types)指针类型(Pointer types)
其中指针类型只在不安全代码下使用,一般不涉及所以今天不讨论。我们主要探讨引用类型和值类型。
一、基本定义
值类型的变量在声明后,系统直接在托管栈中为其分配内存并保存其数据,其中值类型包括:byte,short,int,long,float,double,decimal,char,bool 和 struct等,当我们声明一个引用类型时,系统并不会立刻在托管堆上分配空间,只有当我们使用new实例化后,系统才在托管堆上开辟一个内存空间保存其数据,并且将地址保存到托管栈中, 引用类型包括数组、类、接口、委托、数据等,所以引用类型不包含存储在变量中的实际数据,而是保存实际数据的引用,如有多个引用变量操作时,只要有一个变量将值改变,其他变量会自动反映这种值的变化,比如我们申明了以下变量:
static void Main(string[] args)
{
string name = "高俊涛";
int age = 20;
string className = "高三七班";
Console.WriteLine($"姓名:{name}n年龄:{age}n班级:{className}");
Console.ReadLine();
}
那么按照上面的分析,由于age是值类型,name和className为引用类型,所以age直接在托管栈中保存变量和数据,而name和className则保存的是一个引用,这个引用指向托管堆,托管堆里面才保存相应的数据。

这两者既有联系又有区别,并且这两之间可以转化,就是我们说的“装箱”操作和“拆箱”操作,相同点和不同点总结如下:
二、相同点
引用类型可以实现接口,值类型当中的结构体也可以实现接口; 引用类型和值类型都继承自System.Object类,C#中的所有类型其实都继承System.Object,它是多有数据类型的基类。三、不同点
虽然值类型和引用类型都继承自System.Object类。但几乎所有的引用类型都直接从System.Object继承,而值类型则继承其子类System.ValueType,
System.ValueType直接继承System.Object,但System.ValueType本身是一个类类型,而不是值类型;System.ValueType没有添加任何成员,但覆盖了所继承的一些方法,
使其更适合于值类型。此外需要特别注意的是string类型虽然为引用类型,但我们在平时操作时却发现它更像值类型,这是因为操作符重载的结果,但它仍为引用类型。
其数据类型的继承关系如下:

四、数据类型转化:
上面分析的c#的数据类型后,那么我们可能会想到这些类型之间的相互转换,我么数据类型转换从根本上说是类型铸造,或者说是把数据从一种类型转换为另一种类型。










