C#类型学习
C#类型概览
对C#的数据类型学习首先对整体做一个把握,C#数据类型的分类和层次如下所示 :
C#数据类型
- 值类型
- 简单类型(Simple type)
- 整形
- 浮点型
- 十进制型(decimal)
- 布尔型(bool)
- 字符型(char)
- 结构类型(Struct type)
- struct
- 枚举类型(Enumeration types)
- enum
- 简单类型(Simple type)
- 引用类型
- 类(class)
- 接口(interface)
- 委托(delegate)
按照微软的划分,struct和简单类型组成Struct(结构)类型,而值类型由Struct(结构)类型和枚举类型组成。就我个人而言觉得以上划分更为合理,也便于学习,毕竟struct比起简单类型有更多要学习的东西。
值类型和引用类型的区别
值类型和引用类型最大的区别在于:值类型的变量总是包含该类型的值。对值类型变量赋值将创建所赋的值的一个副本,而对引用类型变量赋值将创建引用的副本,而不是引用对象的副本。其余的还有:
- 所有的值类型均隐式派生自Object类。
- 与引用类型不同,从值类型不可能派生出新的类型。但与引用类型相同的是,结构也可以实现接口。
- 与引用类型不同,值类型不可能包含null值。
- 每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。
以上是从MSDN中摘录的说明。到目前我我还不太清晰的是:“所有的值类型均隐式派生自Object类”。主要是对隐式派生未理解。另外也未查到相关的代码。
简单类型
对于简单类型,要特别说明的是:
- 所有的简单类型均为.NET Framework系统类型的别名。即每一个简单类型都有相应的.NET Framework类型与之对应。(参见下表)
- 简单类型可以使用文字初始化,也可以使用new调用默认的构造函数进行初始化。(使用默认函数初始化后的默认值可参见下表。)
所谓的两种初始化如下所示:
int myint; //声明变量
myint=0; //或者 myint=new int();
myint=0; //或者 myint=new int();
当然也可以声明和初始化一起完成。
int myint=0; //或者int myint=new int();
注意在C#中,局部变量不进行初始化是无法使用的。
struct类型
struct 类型是一种可包含构造函数、常数、字段、方法、属性、索引器、运算符、事件和嵌套类型的值类型。不知你有没有想过这个问题:“为什么需要struct”?确实,似乎有了class,更符合OO我们无须struct。看看MSDN中给我们的解释:struct类型适合表示如点、矩形和颜色这样的轻量对象。尽管可能将一个点表示为类,但结构在某些方案中更有效。例如,如果声明一个含有1000个点对象的数组,则将为引用每个对象分配附加的内存。在此情况下,结构的成本较低。没错,因为struct是值类型,所以它会更高效。
关于struct,还有一些东西要提醒大家:
- 声明结构的默认(无参数)构造函数是错误的。系统总是提供默认构造函数初始化结构成员(默认值参考下表)。
- 在结构中初始化实例字段是错误的。
- 如果不使用 new,那么在初始化所有字段之前,字段将保持未赋值状态且对象不可用。
- 结构不存在继承,但结构从基类Object继承。结构可实现接口,其方式同类完全一样。
- 你可以对构造函数进行重载。
最后,再次提醒大家,struct是值类型,请在参数传递时注意这一点。另外,struct的数据成员(字段)可以是其他的引用类型。
枚举类型enum
一直用得最少的类型。看看,MSDN的解释:由一组称为枚举数列表的命名常数组成的独特类型。每种枚举类型均有一种基础类型,此基础类型可以是除 char 类型外的任何整型。要说的东西不多,感觉就是起到助记的作用。
C# 类型 | .NET Framework 类型 | 说明 | 取值范围 | 默认值 |
---|---|---|---|---|
bool | System.Boolean | 布尔类型 | true|false | false |
byte | System.Byte | 无符号 8 位整数 | 0 到 255 | 0 |
sbyte | System.SByte | 有符号 8 位整数 | -128 到 127 | 0 |
char | System.Char | 16 位 Unicode 字符 | U+0000 到 U+ffff | '/0' |
decimal | System.Decimal | 十进制类型,28 到 29 位有效位 | ±1.0 × 10-28 到 ±7.9 × 1028 | 0.0M |
double | System.Double | 双精度浮点数,15 到 16 位 | ±5.0 × 10-324 到 ±1.7 × 10308 | 0.0D |
float | System.Single | 单精度浮点数,7 位 | ±1.5 ×10-45 到 ±3.4 × 1038 | 0.0F |
int | System.Int32 | 有符号 32 位整数 | -2,147,483,648 到 2,147,483,647 | 0 |
uint | System.UInt32 | 无符号 32 位整数 | 0 到 4,294,967,295 | 0 |
long | System.Int64 | 有符号 64 位整数 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 | 0L |
ulong | System.UInt64 | 无符号 64 位整数 | 0 到 18,446,744,073,709,551,615 | 0 |
short | System.Int16 | 有符号 16 位整数 | -32,768 到 32,767 | 0 |
ushort | System.UInt16 | 无符号 16 位整数 | 0 到 65,535 | 0 |
string | System.String | Unicode 字符的字符串 | ||
object | System.Object | 所有数据类型无论是预定义的还是用户定义的,均从 System.Object 类继承 | ||
struct | 结构类型 | 将所有的值类型字段设置为默认值并将所有的引用类型字段设置为 null 时产生的值。 | ||
enum | 枚举类型 | 表达式 (E)0 产生的值,其中 E 为 enum 标识符。 |