Ø 前言
每个编程语言都有基本的数据类型,例如 C、C++、Java、Python、PHP、JavaScript、以及各种数据库等,而 C# 也不例外。本篇主要讨论 C# 中的一些常用的基础数据类型。
1. 值类型
Ø 值类型隐式继承于 System.ValueType,而 System.ValueType 隐式继承于 System.Object。在程序运行时,值类型的数据存储在内存栈中。下面列出 C# 中的值类型:
1) bool, System.Boolean 类型,它用于声明变量来存储布尔值 true 和 false。
2) sbyte, System.SByte 类型,最小值为-128,最大值为127,可显示转换为 int、long、double、float、decimal 类型。
3) byte, System.Byte 类型,最小值为0,最大值为255,可显示转换为 int、long、double、float、decimal 类型。
4) short, System.Int16 类型,最小值为-32768,最大值为32767,可显示转换为 int、long、double、float、decimal 类型。
5) ushort, System.UInt16 类型,最小值为0,最大值为65535,可显示转换为 int、long、double、decimal、float 类型。
6) int, System.Int32 类型,最小值为-2147483648,最大值为2147483647;可显示转换为 long、double、decimal、float 类型。
7) uint, System.UInt32 类型,最小值为0,最大值为4294967295,声明 uint 类型变量使用后缀 u或U,可显示转换为 long、double、decimal、float 类型。
8) long, System.Int64 类型,最小值为-9223372036854775808,最大值为9223372036854775807L,声明 long 类型变量使用后缀 l或L,可显示转换为 double、decimal、float 类型。
9) ulong, System.UInt64 类型的最小值为0,最大值为18446744073709551615,声明 long 类型变量使用后缀 ul或UL,可显示转转为 double、decimal、float 类型。
10) float, System.Singe 类型,最小值为-3.4 × 1038,最大值为+3.4 × 1038,表示存储32位浮点值的简单类型,声明 float 类型变量使用后缀 f或F,可显示转换为 double 类型,转为 int、long、decimal 类型,需隐式转换。
11) double, System.Double 类型,最小值为±5.0 × 10−324,最大值为±1.7 × 10308,表示存储64位浮点值的简单类型,声明 double 类型变量使用后缀 d或D;换为 int、long、float、decimal 类型,需隐式转换。
12) decimal, System.Decimal 类型的大致范围(-7.9 x 1028 - 7.9 x 1028) / (100 - 28),表示128位数据类型,同浮点型相比,decimal 类型具有更高的精度和更小的范围,这使它适合于财务和货币计算,声明 decimal 类型变量使用后缀 m或M,转为 int、long、double、float 类型,需隐式转换。
13) char, System.Char 类型范围(U+0000 到 U+FFFF),用于声明 .NET framework 使用Unicode字符表示 System.Char 结构的实例;可显示转换为 short、int、long、float、double、decimal 类型。转为 string 类型,需使用 ToString() 方法。
14) enum, System.Enum 类型,一种由一组称为枚举数列表的命名常量组成的独特类型。
15) struct 类型,通常用来封装小型相关变量组,例如:矩形的坐标或库存商品的特征。
2. 引用类型
Ø 引用类型的变量存储对实际数据的引用。
Ø 申明引用类型关键字:class、interface、delegate。
Ø 内置引用类型:dynamyic、object、string。
1) class
2) 委托
1. 创建委托实例的三种方式
1) 使用相同签名的方法创建。
2) 使用匿名方法创建。
3) 使用lambda表达式创建。
3) dynamic
1) dynamic与object的区别
1. dynamic与其它类型之间赋值不需要拆箱和装箱,而object需要拆箱和装箱。
4) 接口
1) 接口只能包含方法、属性、事件和索引器。
5) object
1) 在 C# 的统一类型系统中,所有类型(预定义类型、用户定义类型、引用类型和值类型)都是直接或间接从 Object 继承的。 可以将任何类型的值赋给 object 类型的变量。将值类型的变量转换为对象的过程称为“装箱”。 将对象类型的变量转换为值类型的过程称为“取消装箱”。
6) string
1) string 类型表示一个字符序列(零个或更多 Unicode 字符)string 是 .NET Framework 中 String 的别名。尽管 string 是引用类型,但定义相等运算符(== 和 !=)是为了比较 string 对象(而不是引用)的值。
3. 数组
2) 数组类型是从抽象基类型 Array 派生的引用类型。由于此类型实现了 IEnumerable 和 IEnumerable<T>,因此可以对 C# 中的所有数组使用 foreach 迭代。
3) 总结:多维数组与交错数组的区别在于,多位数组中相同等级的数组元素大小必须一致;而交错数组可以不相同。
1) 一维数组
1. 属性
1) Rank 获取 System.Array 的秩(维数)。
2. 方法
1) GetLength() 获取一个 32 位整数,该整数表示 System.Array 的指定维中的元素数。
2) Reverse() 反转序列中元素的顺序。
2) 多维数组
3) 交错数组
1. 交错数组是元素为数组的数组,交错数组元素的维度和大小可以不同,交错数组有时称为“数组的数组”。以下示例说明如何声明、初始化和访问交错数组。
4. 类
1) 类是一种“引用类型”,创建类的对象时,对象赋值到的变量只保存对该内存的引用。将对象引用赋给新变量时,新变量引用的是原始对象。通过一个变量做出的更改将反映在另一个变量中,因为两者引用同一数据。
2) 类(而非结构)支持继承的概念。派生自另一个类(“基类”)的类将自动包含基类除构造函数和析构函数之外的所有公共、受保护和内部成员。
3) 可以将类声明为抽象类,表示该类的一个或多个方法不具有实现。抽象类虽然无法直接实例化,但可以用作其他类的基类,由其他类提供缺少的实现。还可以将类声明为密封类,以禁止其他类从该类继承。
4) 可以将类(不是结构)声明为静态。静态类只能包含静态成员,不能使用 new 关键字进行实例化。在程序加载时,静态类的一个副本将加载到内存中,可通过类名称访问该类的成员。类和结构都可以包含静态成员。
5) 可以在一个代码文件中定义类、结构或方法的一部分,而在另一个代码文件中定义另一部分。
5. 结构
1) 结构是一种值类型。创建结构时,结构赋值到的变量保存该结构的实际数据。将结构赋给新变量时,将复制该结构。因此,新变量和原始变量包含同一数据的两个不同的副本。对一个副本的更改不影响另一个副本。
2) 在结构声明中,除非字段被声明为 const 或 static,否则无法初始化。
3) 结构不能声明默认构造函数(没有参数的构造函数)或析构函数。
4) 结构在赋值时进行复制。将结构赋值给新变量时,将复制所有数据,并且对新副本所做的任何修改不会更改原始副本的数据。在使用值类型的集合(如 Dictionary<string, myStruct>)时,请务必记住这一点。
5) 结构是值类型,而类是引用类型。
6) 与类不同,结构的实例化可以不使用 new 运算符。
7) 结构可以声明带参数的构造函数。
8) 一个结构不能从另一个结构或类继承,而且不能作为一个类的基。所有结构都直接继承自 System.ValueType,后者继承自 System.Object。
9) 结构可以实现接口。
10) 结构可用作可以为 null 的类型,因而可向其赋 null 值。
11) 如果使用 new 运算符创建结构对象,则会创建该结构对象,并调用适当的构造函数。与类不同,结构的实例化可以不使用 new运算符。在此情况下不存在构造函数调用,因而可以提高分配效率。但是,在初始化所有字段之前,字段将保持未赋值状态且对象不可用。
6. 其他
1. void:void 是 .NET Framework 中 System.Void 类型的别名。
2. var:从 Visual C# 3.0 开始,在方法范围中声明的变量可以具有隐式类型 var。隐式类型的本地变量是强类型变量(就好像您已经声明该类型一样),但由编译器确定类型。
3. 派生类可以通过将重写声明为sealed 来停止虚拟继承。这需要在类成员声明中的 override 关键字前面添加 sealed 关键字。
4. out 关键字,按地址传递参数,参数传递前不需要赋值,在方法中使用前必须初始化,只出不进。
5. ref 关键字,按地址传递参数,参数传递前必须赋值,在方法中使用前不需要初始化,有进有出。