C#类型学习
C#类型概览
对C#的数据类型学习首先对整体做一个把握,C#数据类型的分类和层次如下所示 :
C#数据类型
- 值类型
- 简单类型(Simple type)
- 整形
- 浮点型
- 十进制型(decimal)
- 布尔型(bool)
- 字符型(char)
- 结构类型(Struct type)
struct
- 枚举类型(Enumeration types)
enum
- 引用类型
- 类(class)
- 接口(interface)
- 委托(delegate)
按照微软的划分,struct和简单类型组成Struct(结构)类型,而值类型由Struct(结构)类型和枚举类型组成。就我个人而言觉得以上划分更为合理,也便于学习,毕竟struct比起简单类型有更多要学习的东西。
值类型和引用类型的区别
值类型和引用类型最大的区别在于:值类型的变量总是包含该类型的值。对值类型变量赋值将创建所赋的值的一个副本,而对引用类型变量赋值将创建引用的副本,而不是引用对象的副本。其余的还有:
- 所有的值类型均隐式派生自Object类。
- 与引用类型不同,从值类型不可能派生出新的类型。但与引用类型相同的是,结构也可以实现接口。
- 与引用类型不同,值类型不可能包含null值。
- 每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。
以上是从MSDN中摘录的说明。到目前我我还不太清晰的是:“所有的值类型均隐式派生自Object类”。主要是对隐式派生未理解。另外也未查到相关的代码。
简单类型
对于简单类型,要特别说明的是:
- 所有的简单类型均为.NET Framework系统类型的别名。即每一个简单类型都有相应的.NET Framework类型与之对应。(参见下表)
- 简单类型可以使用文字初始化,也可以使用new调用默认的构造函数进行初始化。(使用默认函数初始化后的默认值可参见下表。)
所谓的两种初始化如下所示:
int myint; //声明变量
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 类型外的任何整型。要说的东西不多,感觉就是起到助记的作用。