C#基础(一):数据类型

作者:陆金龙    发表时间:2015-05-13 00:05   


学编程较快捷的切入方式是先了解编程语言的数据类型及基本语法,然后学习一些常用类库。在实践过程中不断积累编程知识,并掌握越来越多类库的使用,逐步达到通过编程解决一些问题的目的。

C#中数据类型较多,怎么学习才能达到有条有理?个人认为应该大处着眼,小处着手。即从大的分类上理解和把握,而要真正掌握这些类型,则需要从小处着手,针对实际项目常用的具体类型,强加练习,逐个突破。

一、值类型与引用类型

值类型

主要有结构和枚举两类组成,还包括对应的可空类型。

结构包括数值型(整型、浮点型、decimal)、bool、用户自定义结构。

枚举是一种由一组称为枚举数列表的命名常量组成的独特类型。枚举的基础类型可以是除 char 以外的任何整型,枚举元素的默认基础类型为 int

引用类型

包括类、接口、委托、string、dynamic、object、数组。

数组类型是从抽象基类型 Array 派生的引用类型

值类型与引用类型比较

派生:C#的所有值类型均隐式派生自System.ValueType,不能从值类型派生出新的类型。 引用类型派生自System.Object。但与引用类型相同的是,结构也可以实现接口。

存储:值类型的实例经常会存储在栈上的(但如果某个类的实例有个值类型的字段,那么该字段会和类实例保存在同一个地方,即堆中)。

   引用类型的对象总是存储在堆中。

传值:值类型赋值是重新创建一个副本,而引用类型的赋值是共享同一块内存(副本),只是复制引用而不复制被引用识别的对象。

Null值:值类型无法包含 null 值。 但是,可以为 null 的类型允许值类型分配给 null。

二、复杂类型:结构体与类

结构体

适合 Point、Rectangle 和 Color 等轻量对象,这些数据结构包含的数据以创建结构后不修改的数据为主。

类通常用于对较为复杂的行为建模,或对要在创建类对象后进行修改的数据建模。 

结构体与类比较

相同点

语法:结构与类共享大多数相同的语法。

成员:结构与类都有字段和方法成员(数据和行为),都可以有静态成员。

实现接口:结构与类都可以实现接口。

不同点 

类型:

结构是值类型,创建结构时,结构赋值到的变量保存该结构的实际数据;

类是引用类型,创建类的对象时,对象赋值到的变量只保存对该内存的引用 。

继承性:

结构都直接继承自 System.ValueType,不能从另一个结构或类继承,不能被继承。

类继承自 System.Object,可以从其他类继承和被其他类继承。

类型声明:

结构不能显示声明无参构造函数或析构函数,但可以声明带参数的构造函数。在结构声明中,除非字段被声明为 const 或 static,否则无法初始化(不能在定义结构时初始化实例字段)。

实例化:

与类不同,结构的实例化可以不使用 new 运算符。在此情况下不存在构造函数调用,可以提高分配效率。

         类型使用:

结构严格遵循先声明、后赋值、再使用的原则,使用前必须对所有字段赋初值。

可以在有参的构造方法中赋值或通过访问结构的成员进行赋值,对于私有的非静态成员只能在有参构造方法中赋值。