枚举
枚举是值类型
声明枚举
声明枚举使用enum关键字.
使用枚举
还可以用可空修饰符?创建可空枚举类型。
Season? a = null;
选择枚举字面值
枚举内部的每个元素都关联一个整数值。默认第一个元素对应整数位0,以后每个元素对应的整数都递增1.
可将特定整数常量和枚举类型的字面值手动关联起来,比如
后面的summer,Fall,Winter依次递增1,所以就是1,2,3,4.
…
…
选择枚举的基础类型
声明枚举时,枚举字面值默认是int类型.
也可以修改枚举的基础类型,比如:
这样做可以节省内存。枚举可以基于8中整型的任何一种:
byte,sbyte,short,ushort,int,uint,long,ulong.
比如byte,最多就只能容纳256个字面值.
结构
如果你学过C或者C++,对结构应该不陌生.在C#语言中,int,long和float分别是System.Int32,System.Int64和System.Single这三个结构的别名。
类定义的是引用类型,总是在堆上创建。有时类只包含极少数据,因为管理堆而产生的开销不合算。这时最好的方法是使用结构。结构是值类型,在栈上存储,能有效减少内存管理的开销。
结构可包含字段、方法和构造器(但不能主动声明默认构造器).
声明结构
声明结构以struct关键字开头。
比如
大多数时候不要在结构中声明公共字段,更好的做法是使用私有字段,并使用构造器和方法来初始化和处理字段.
复制值类型的变量将获得值的两个拷贝。复制引用类型的变量,将获得对同一个对象的两个引用。简单的、比较小的数据,复制值的效率基本等同于复制地址的效率,就使用结构。
如果较复杂的数据就要考虑使用类。
…
结构和类的区别
不能为结构声明默认构造器。因为编译器始终都会自动生成一个。而在类中,只有在自己没有写构造器的时,编译器才会自动生成一个默认的.
如果不想使用默认构造器,可以提供一个非默认的构造器,用它将字段初始化成不同的值.然而,自己写的构造器必须显式地初始化所有字段。
类的实例字段可在声明时初始化,但结构不允许。
和枚举一样,可用?修饰符创建可空结构.
结构的初始化
Time now = new Time();
由于结构是值类型,不调用构造器也可以创建结构变量
Time now;
虽然变量已经创建了,但其中的字段未初始化,试图访问这些字段会造成编译时错误.
复制结构变量
可将结构变量初始化或赋值为另一个结构变量,前提是赋值操作符=右侧的结构变量已完全初始化。