一、类型
预定义类型
C#提供了16种预定义类型,其中包括13种简单类型和3种非简单类型
![](https://img-blog.csdnimg.cn/img_convert/234fcfe7e43b4c2a1895e533e84aa6a4.png)
13种简单类型
十一种数值类型
不同长度的有符号和无符号整数类型
浮点数float和double
高精度小数类型decimal(常用于货币的计算)
一种Unicode字符类型char
一种布尔类型bool
![](https://img-blog.csdnimg.cn/img_convert/5b90e592a6158e331fcaba84f2be5814.png)
3种非简单类型
string,它是一个Unicode字符数组
object,所有其他类型的基类
dynamic,使用动态语言编写的程序集时使用
![](https://img-blog.csdnimg.cn/img_convert/03c53611e5fb30278cee54d18dccefef.png)
用户自定义类型
除了C#提供的预定义类型,用户还可以创建自己的用户定义类型。有6种类型可以用户自己创建:
类类型(class)
结构类型(struct)
数组类型(array)
枚举类型(enum)
委托类型(delegate)
接口类型(interface)
二、成员
在类中可以包含许多不同类型的数据项,这些数据项的个体称为成员,成员包括数据成员和函数成员。
数据成员
存放类相关的数据。
函数成员
执行代码,定义类型的行为。
三、栈和堆
运行中的程序使用两个内存区域存储数据:栈和堆。
栈
栈是一个内存数组,是一个LIFO(Last-In First-Out,后进先出)的数据结构,存储下列类型数据:
某些类型变量的值
程序当前的执行环境
传递给方法的参数
栈的特征:
数据只能从栈的顶端插入和删除
把数据放到栈顶称为入栈(push)
从栈顶删除数据称为出栈(pop)
![](https://img-blog.csdnimg.cn/img_convert/37d3ab8e48395855e3de4f16fda529b2.png)
堆
在堆里可以分配大量内存用于存储某类型的数据对象。与栈不同,堆里的内存可以以任意顺序存入和移除。虽然可以在堆中保存数据,但并不能显示删除数据。CLR的自动GC可以自动清除不再被引用的堆对象。
![](https://img-blog.csdnimg.cn/img_convert/d7a7bd012e6fe8023113e47dbb39455e.png)
四、值类型和引用类型
数据项的类型定义了存储数据需要的内存大小、组成该类型的数据成员和对象在内存中的存储位置——栈或堆。类型被分为两种:值类型和引用类型。这两种类型的对象在内存中的存储方式不同。
值类型
值类型在栈中存储实际的数据
引用类型
引用类型需要两段内存
第一段:在堆中存储实际的数据
第二段:在栈中存放一个引用,指向数据在堆中存放的位置
![](https://img-blog.csdnimg.cn/img_convert/f337913264e36fa7b7a4f463515dae30.png)
存储引用类型对象的成员(成员数据的存储)
重点理解:数据是另一个对象的成员时该如何存储?例如:一个引用类型的实例MyType,其中包含一个值类型成员A(数据)和一个引用类型成员B(数据)。
尽管成员A是值类型,但是它也是MyType实例数据的一部分,所以存放在堆中。
成员B是引用类型,其数据部分会始终存放在堆里,它的引用部分也会存放在堆里,封装在MyType对象的数据部分中。
![](https://img-blog.csdnimg.cn/img_convert/1595e2d31f35f95da817faf9305cc837.png)
总结:
引用类型对象的数据部分始终存放在堆里。
根据实际情况,值类型对象或引用数据类型的引用部分可以存放在堆里,也可以存放在栈里。
对于引用类型的任何对象,它所有的数据成员全部存放在堆中,不论他们是值类型还是引用类型。
值类型和引用类型的分类
![](https://img-blog.csdnimg.cn/img_convert/e44f99d526a489e3a2d2e31c0f2b00f6.png)
(注:本章内容学习总结自《C#图解教程》)