9.1 C#有两种数据类型,值类型和引用类型。除了基本数据类型,C#还支持两种值类型,枚举和结构。
*枚举类型可以理解为自定义的数据类型,基元类型int是所有整数的集合,包含所有整数,枚举类型是自己定义的一个集合,包含自己定义的元素。
9.1.1声明枚举类型
关键字 enum,后跟大括号,括号内用逗号分隔
enum Season {spring,sunmmer,fall,winter};
Season AA = Season.spring;
Console.Write(AA);//输出spring
string CC= AA.ToString();//使用ToString方向显示转化枚举类型值
Console.Write(CC);//输出spring
Season? BB = null;
9.1.2使用枚举类型
Season 是类型名,枚举类型只有赋值之后才能使用,
也可以用修饰符?创建可空枚举变量,将null赋值给枚举类型变量。
Season AA = Season.spring;此处必须写Season.spring,不能写spring,每个枚举定义的字面值名称都只有该枚举类型的作用域。不同的枚举类型可以包含同名的字面值。
适合整数变量的许多标准操作符也适用于枚举类型变量,bitwise和shift除外
9.1.3选择枚举类型的字面值
枚举内部的每个元素都对应一个整数值,默认第一个元素对应0,以后的每个整数递增1.
enum Season {spring,sunmmer,fall,winter};
Season AA = Season.fall;
Console.Write((int)AA);//输出3
enum Season {spring=1,sunmmer,fall,winter};
Season AA = Season.fall;
Console.Write(AA);//输出3
枚举的多个字面值可以对应同一个基础数值。
enum Season {spring=1,sunmmer,fall,autumn=fall,winter};
Season AA = Season.autunm;
Console.Write(AA);//输出3
枚举类型变量也可以执行数学运算。但运算结果溢出时,运行时会解释成对应的整数值。
9.1.4选择枚举类型的基础类型
声明枚举类型时,枚举字面值默认是int型,但是也可以让枚举类型基于8种基础整数值的任何一种:byte,sbyte,short,ushort,int,uint,long,ulong.
例如 enum Season : short { spring,summer,fall,winter}
这样可以节省内存。
9.2使用结构
类是引用类型,总是在堆上创建,结构是值类型,在栈上存储,只包含极少数数据的类可以创建成结构struct,可以节省内存。
结构包含自己的字段、方法和构造器(但不能主动声明默认构造器)。
9.2.1声明结构
和类一样,大多数时候都不要在结构中声明公共字段,因为无法控制它的值。使用私有字段并为结构添加构造器和方法来初始化它的值和处理字段。
struct Time
{
private int hours,minutes,seconds;
public Time(int hh,int mm,int ss)
{
this.hours = hh%24;
this.minutes = mm%60;
this.seconds = ss%60;
}
public int Hpurs()
{
return this.hours;
}
}
许多常用操作符不能应用于自定义的结构类型,比如==和!=,但可以使用Equals()方法来比较。
9.2.2
*结构不能声明自己的默认构造器,是因为编译器始终都会自动生成一个。结构内的字段必须显示初始化,否则无法编译。
*类的实例字段可以在声明时初始化,但结构不可以。