1、结构
结构是程序员定义的类型,与类相似,有数据成员和函数成员,区别在于结构是值类型,类是引用类型,并且结构是隐式密封的,不能从结构派生其他结构。不允许使用实例属性和字段初始化语句。但是静态属性和静态字段可以在声明结构体时进行初始化。
声明结构的语法:
把一个结构赋值给另一个结构,就是讲一个结构复制给另一个结构,与复制类变量不同,复制类变量只复制引用。
结构会有一个隐式的无参实例构造函数,为结构的每个成员设置为该类型的默认值,与类不同的是,类只有在用户不定义构造函数时才会隐式提供一个无参构造函数。编译器给结构提供的无参构造函数时不可剔除和重定义的。用户可以创建有参数的构造函数。
创建结构的对象的时候可以不使用new运算符创建,这样的话就没有调用构造函数,因此必须显式设置数据成员之后才能使用他们的值,才能调用结构的函数成员。
结构也可以后静态构造函数,当调用显式声明的构造函数或者引用结构的静态成员时就会调用静态构造函数。
protected、protected internal、abstract、virtual、sealed这些修饰符都不能用于结构。
2、枚举
枚举是由程序员定义的类型,值类型,因此直接存储数据,枚举只有一种类型的成员:命名的整数值常量,“,”隔开。不能对枚举的成员使用修饰符,成员都是静态的,访问可以使用枚举名称.成员名,或者using static指令从而省略类型名。 另外不可以比较不同枚举的成员的大小,因为枚举是个独特的类型,会导致编译器报错
默认情况下,底层类型为int,编译器对第一个成员赋值0,之后递加。可以冒号设置底层类型,可以设置显示值,如果显示设置了一个,后面如果没有显示设置值,就遵循+1的默认值。
Enum类型还有静态方法:GetName方法,参数为一个枚举类型对象和一个整数,返回相应枚举类型成员。
位标识:程序员们长期是用单个字的不同位作为表示一组开关标志的紧凑方法。用枚举实现标志字:
首先确定需要多少标志位,选择合适的无符号类型保存,之后圈定每个位代表什么,给它们一个名称,声明一个枚举。之后使用按位或(OR)运算符在持有该位标志的字中设置适当的位,使用按位(AND)运算符或HasFlag方法检查是否设置了特定位标志。
例如:
这个例子是也十六进制,现在可以用二进制了,要创建一个带有适当位标识的字,用按位或的方法:
要判断标志字是否包含特定的为标志,可以用HasFlag方法,或者使用与该位按位与之后再比较的方法。
flags特性:在枚举前加了flags的区别在于:
为什么会输出12? 原因是计算出int为12 ,但是ToString方法没有查到哪个枚举成员的值是12,于是打印出12、
如果有了Flags特性,将告诉ToString方法位可以分开考虑,此时将返回它们的名称,用逗号隔开。