类型

预定义类型

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
2
3
int var1;          //值类型
int var2; //值类型
Dealer theDealer; //引用类型

变量初始化

1
int var = 17;

自动初始化

变量类型 存储位置 自动初始化 用途
局部变量 栈或者栈和堆 用于函数成员内部的局部计算
类字段 类的成员
结构字段 栈或堆 结构的成员
参数 用于把值传入或传出方法
数组元素 数组的成员

多变量声明

1
2
3
//声明一些变量,有的被初始化,有的未被初始化
int var3 = 7, var4, var5 = 3;
double var6, var7 = 6.2;

静态类型和dynamic关键字

变量的类型在编译的时候确定并且不能在运行式修改,叫做静态类型。
dynamic关键字,代表一个特定的C#类型,它直到如何在运行时解析自身。

可空类型

引用类型,可以设置为null
可空类型允许创建可以标记为有效或无效的值类型变量,这样就可以在使用它之前确定值得有效性。普通得值类型称为非空类型。