C#基础(一):数据类型
学编程较快捷的切入方式是先了解编程语言的数据类型及基本语法,然后学习一些常用类库。在实践过程中不断积累编程知识,并掌握越来越多类库的使用,逐步达到通过编程解决一些问题的目的。
C#中数据类型较多,怎么学习才能达到有条有理?个人认为应该大处着眼,小处着手。即从大的分类上理解和把握,而要真正掌握这些类型,则需要从小处着手,针对实际项目常用的具体类型,强加练习,逐个突破。
一、值类型与引用类型
值类型
主要有结构和枚举两类组成,还包括对应的可空类型。
结构包括数值型(整型、浮点型、decimal)、bool、用户自定义结构。
枚举是一种由一组称为枚举数列表的命名常量组成的独特类型。枚举的基础类型可以是除 char 以外的任何整型,枚举元素的默认基础类型为 int。
引用类型
包括类、接口、委托、string、dynamic、object、数组。
值类型与引用类型比较
派生:C#的所有值类型均隐式派生自System.ValueType,不能从值类型派生出新的类型。 引用类型派生自System.Object。但与引用类型相同的是,结构也可以实现接口。
存储:值类型的实例经常会存储在栈上的(但如果某个类的实例有个值类型的字段,那么该字段会和类实例保存在同一个地方,即堆中)。
引用类型的对象总是存储在堆中。
传值:值类型赋值是重新创建一个副本,而引用类型的赋值是共享同一块内存(副本),只是复制引用而不复制被引用识别的对象。
Null值:值类型无法包含 null 值。 但是,可以为 null 的类型允许值类型分配给 null。
二、复杂类型:结构体与类
结构体
适合 Point、Rectangle 和 Color 等轻量对象,这些数据结构包含的数据以创建结构后不修改的数据为主。
类
类通常用于对较为复杂的行为建模,或对要在创建类对象后进行修改的数据建模。
结构体与类比较
相同点
语法:结构与类共享大多数相同的语法。
成员:结构与类都有字段和方法成员(数据和行为),都可以有静态成员。
实现接口:结构与类都可以实现接口。
不同点
类型:
结构是值类型,创建结构时,结构赋值到的变量保存该结构的实际数据;
类是引用类型,创建类的对象时,对象赋值到的变量只保存对该内存的引用 。
继承性:
结构都直接继承自 System.ValueType,不能从另一个结构或类继承,不能被继承。
类继承自 System.Object,可以从其他类继承和被其他类继承。
类型声明:
结构不能显示声明无参构造函数或析构函数,但可以声明带参数的构造函数。在结构声明中,除非字段被声明为 const 或 static,否则无法初始化(不能在定义结构时初始化实例字段)。
实例化:
与类不同,结构的实例化可以不使用 new 运算符。在此情况下不存在构造函数调用,可以提高分配效率。
类型使用:
结构严格遵循先声明、后赋值、再使用的原则,使用前必须对所有字段赋初值。
可以在有参的构造方法中赋值或通过访问结构的成员进行赋值,对于私有的非静态成员只能在有参构造方法中赋值。