C#类型、存储与变量(四)
类型
预定义类型
C#提供了16种预定义类型,其中包括13种简单类型和3种非简单类型。

![[csharp-4-var-type.png]]
预定义简单类型
| 名称 | 含义 | 范围 | .NET 框架类型 | 默认值 |
|---|---|---|---|---|
| sbyte | 8 位有符号整数 | -128~127 | System.SByte | 0 |
| byte | 8 位无符号整数 | 0~255 | System.Byte | 0 |
| short | 16 位有符号整数 | -32 768~32 767 | System.Int16 | 0 |
| ushort | 16 位无符号整数 | 0~65 535 | System.UInt16 | 0 |
| int | 32 位有符号整数 | -2 147 483 648~2 147 483 647 | System.Int32 | 0 |
| uint | 32 位无符号整数 | 0~4 294 967 295 | System.UInt32 | 0 |
| long | 64 位有符号整数 | -9 223 372 036 854 775 808 ~9 223 372 036 854 775 807 |
System.Int64 | 0 |
| ulong | 64 位无符号整数 | 0~18 446 744 073 709 551 615 | System.UInt64 | 0 |
| float | 单精度浮点数 | 1.5×10−45~3.4×1038 | System.Single | 0.0f |
| double | 双精度浮点数 | 5×10−324~1.7×10308 | System.Double | 0.0d |
| bool | 布尔型 | true、false | System.Boolean | false |
| char | Unicode 字符 | U+0000~U+ffff | System.Char | \x0000 |
| decimal | 高精度小数,有效数字 28 位 | ±1.0×10−28~±7.9×1028 | System.Decimal | 0m |
预定义非简单类型
| 名称 | 含义 | .NET 框架类型 |
|---|---|---|
| string | 0 个或多个 Unicode 字符组成的序列 | System.String |
| object | 所有其他类型的基类,包含简单类型 | System.Object |
| dynamic | 动态语言编写的程序集使用,编译时不做类型检查 | 无对应的.NET 类型 |
用户定义类型
有6种可由用户创建的类型:
- 类类型(class);
- 结构类型(struct);
- 数组类型(array);
- 枚举类型(enum);
- 委托类型(delegate);
- 接口类型(interface);
栈和堆
运行中的程序使用两个内存区域来存储数据:堆和栈。
栈
栈是一个内存数组,是一个LIFO(Last-In First-Out, 后进先出)的数据结构。
栈的特征:
- 数据只能从栈的顶端插入和删除。
- 把数据放到栈顶称为入栈(push)。
- 从栈顶删除数据称为出栈(pop)。
堆
堆是一块内存区域,在堆里可以分配大块的内存用于存储某种类型的数据对象。与栈不同,堆里的内存能够以任意顺序存入和移除。
堆里数据不能显示地删除它们,CLR的垃圾收集器,会自动清楚无主的堆对象。
值类型和引用类型
类型被分为两种:值类型和引用类型。

![[csharp-4-var-type2.png]]
- 引用类型对象的数据部分始终存放在堆里。
- 值类型对象或引用类型数据的引用部分可以放在堆里,也可以存放在栈里,依赖于实际环境。

![[csharp-4-var-type3.png]]
c#类型的分类
| 分类 | 值类型 | 引用类型 |
|---|---|---|
| 预定义类型 | sbyte、short、int、long、bool byte、ushort、uint、ulong float、double、char、decimal |
float、double、char、decimal object、string、dynamic |
| 用户定义类型 | struct、enum | class、interface、delegate、Array |
变量
4种变量
| 名称 | 描述 |
|---|---|
| 局部变量 | 在方法的作用域保存临时数据,不是类型的成员 |
| 字段 | 保存和类型或类型实例相关的数据,是类型的成员 |
| 参数 | 用于从一个方法到另一个方法传递数据的临时变量,不是类型的成员 |
| 数组元素 | 通常是同类数据项构成的有序集合的一个成员,可以为局部变量,也可以为类型的成员 |
变量声明
1 | int var1; //值类型 |
变量初始化
1 | int var = 17; |
自动初始化
| 变量类型 | 存储位置 | 自动初始化 | 用途 |
|---|---|---|---|
| 局部变量 | 栈或者栈和堆 | 否 | 用于函数成员内部的局部计算 |
| 类字段 | 堆 | 是 | 类的成员 |
| 结构字段 | 栈或堆 | 是 | 结构的成员 |
| 参数 | 栈 | 否 | 用于把值传入或传出方法 |
| 数组元素 | 堆 | 是 | 数组的成员 |
多变量声明
1 | //声明一些变量,有的被初始化,有的未被初始化 |
静态类型和dynamic关键字
变量的类型在编译的时候确定并且不能在运行式修改,叫做静态类型。dynamic关键字,代表一个特定的C#类型,它直到如何在运行时解析自身。
可空类型
引用类型,可以设置为null。
可空类型允许创建可以标记为有效或无效的值类型变量,这样就可以在使用它之前确定值得有效性。普通得值类型称为非空类型。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 StackPub!