(12)C#枚举,结构
枚举
枚举类型是类似自定义的一个类,类里放着你自己定义的常量,关键字enum。
enum Season{spring,summer,fall,winter}
想用这里的常量的话,首先把变量定义成 Season类型,然后再给它赋值
Season a=Season.fall; Console.WriteLine(a);//输出结果 fall
枚举类型的每一个常量都对应着一个整数值。默认第一个是0,往后依次加1.
上面的spring相当于0,summer相当于1,fall相当于2,winter相当于3.
Console.WriteLine(int(a));//结果输出 2
默认常量是一个int的值,如果想声明成其他类型加 :数据类型
enum Season:short{spring,summer,fall,winter}
这样做的目的是为了节省内存。short比int占的字节要少。
枚举类型可以定义成8种整数类型的任何一种:byte,sbyte,short,ushort,int,uint,long,ulong.
结构
结构是值类型,数据直接存储在栈上。关键字是struct。不能手动写一个默认的无参构造函数,不然执行程序时会报错。
struct A { A() { //运行程序时会报错,显示“结构部能包含显式的无参数构造函数”(写完看不出错误,运行时才会报错) } }
出错原因:声明的结构始终会帮我们生成一个默认的无参构造函数。(类是只有在没写无参构造函数时才会默认生成)
结构的赋值
结构不能直接给变量赋值,除非加了静态关键字。
struct A { public static int x = 5;//可以 public int y=5; //报错 “结构中不能有实例字段初始值” }
结构变量的使用
使用srtuct有两种方法:
1、实例化结构
A a=new A();
2、直接创建
A a;
虽然这两种方式创建后使用的字段都在栈上,但他们的区别在于
.用new实例化的会调用构造函数给他里面的字段初始化。
.但直接创建的它里面的字段需要初始化后才能使用
struct A { public static int x ; public int y; } class B { public static void Main(string[] args) { A a=new A(); Console.WriteLine(A.x);// 结果为0 Console.WriteLine(a.y);// 结果为0 }
这里构造函数会为x,y进行初始化。一般默认初始成0、false、null
struct A { public static int x = 5; public int y; } class B { public static void Main(string[] args) { A a; //声明A 值类型不需要new a.y = 6;//给y赋值 Console.WriteLine(A.x);//静态直接用 A 结果输出 5 Console.WriteLine(a.y);//输出6 }
因为A是值类型所以可以直接用 A a;但是由于没有调用构造器所以需要自己手动的行进初始化。不然会报错。
几点注意
.虽然结构不能用无参构造函数但是可以有含参的构造函数
.结构不能被继承,也不能当做父类
.结构可实现一个或多个接口
.结构成员不能指定为 abstract、virtual 或 protected
.结构不能定义析构函数