C#之枚举(enum)和:base()详解
一,枚举(enum)
1,定义
枚举类型(也称为枚举)提供了一种有效的方式来定义可能分配给变量的一组已命名整数常量。该类型使用enum关键字声明。
2,运用场景
我们希望得到一个固定集合的值,采用枚举
3,声明位置
(1),们将枚举声明放到命名空间的下面,类的外面,表示这个命名空间下,所有的类都可以访问这个枚举,
(1),enum关键字就好比public是公共的,和类是平值关系,所以声明位置是在类外面.
(2),enum声明以后,点击启动 不管在哪个类中输出,程序会自动找到main方法,就是程序的主入口进行启动
4,枚举的类型
(1),每个枚举都有一个基础类型,该基础类型可以是除char外的任何整数类型,枚举元素的默认基础类型是int。
(2),已批准的枚举类型有byte、sbyte、short、ushort、int、uint、long或ulong。
(3),可以为枚举类型的枚举器列表中的元素分配任何值,也可以使用计算值。
(4),只不过枚举声明, 赋值, 使用的方式 跟平常我们所见的普通变量的类型不一样而已
5,枚举值
(1),默认情况下, 第一个枚举值具有值0,并且每个连续枚举数的值将增加1,
(2),枚举数可以使用初始值设定项来替代默认值。
(3),若设置某一枚举数的值,之后的枚举数仍然按1递增
(4),枚举中的整数值可以重复指定
6,枚举的类型转换
(1),首先定义已命名整数常量
namespace 枚举
{
public enum xb
{
男,
女
}
public enum week
{
周一,
周二,
周三,
周四=4,
周五,
周六,
周日
}
class Program
{
(2), 然后输出并进行类型转换
class Program
{
static void Main(string[] args)
{
//正常输出枚举值
xb xb = xb.男;
Console.WriteLine(xb.男);//男
week week = week.周一;
Console.WriteLine(week.周一);//周一
//枚举的类型转换
//枚举转换为int(索引)
week week1 = week.周四;
Console.WriteLine((int)week1);//4
//数字转换为枚举
int myint= 5;
Console.WriteLine((week)myint);//周五
//枚举转换为字符串
week week2 = week.周二;
Console.WriteLine(week2);//周二(枚举类型)
Console.WriteLine(week2.ToString());//周二(字符串类型)
//字符串转换为枚举
string str = "周一";
Console.WriteLine((week)Enum.Parse(typeof(week),str));//周一
Console.ReadLine();
}
}
(3),最终显示结果
男
周一
4
周五
周二
周二
周一
7,这里我们从结果中发现一个问题,就是如何才能查看转换完成之后的结果是否是一个枚举类型呢?
方法一:
a.GetType()获取当前变量的类型对象
string str = "周一";
Console.WriteLine(str.GetType());
Console.ReadLine();
显示的结果
System.String
方法二;
typeof(String)获取的是String类型的类型对象
你可以把a.GetType() == typeof(String)比较,可以获取a是否是String类型
int myint = 5; Console.WriteLine(myint.GetType()==typeof(int));
Console.ReadLine();
显示的结果
True
方法三;
a is enum 获取一个boolean值表示a是否是enum类型或者可以隐式向上转型成为enum类型的类型
xb xb = xb.男;
Console.WriteLine(xb is Enum);
Console.ReadLine();
显示的结果
True
注意:其他数据也可以使用上面方法
二,:base()详解
1,base调用父类无参构造函数
(1),创建无参父类和子类
class A
{
public A()
{
Console.WriteLine("无参父类构造函数");
}
}
class B:A
{
public B() : base()
{
Console.WriteLine("子类无参的构造函数");
}
}
class C:B
{
public C():base()
{
Console.WriteLine("继承子类无参的构造函数");
}
}
(2)程序主入口里实例化最终的无参子类
static void Main(string[] args)
{
C ASD = new C();
Console.ReadLine();
}
(3),最后的输出结果
无参父类构造函数
子类无参的构造函数
继承子类无参的构造函数
(4),总结
<1>,在父类A里,在父类中手动创建无参构造函数,在子类中同样又创建了无参构造函数,实例化子类以后,执行本类型的构造函数之前,先执行父类的构造函数,输出的是先调用的父类,然后才调用的子类.
<2>,很多构造函数没有参数,而构造函数会默认先调用父类的无参构造函数
(5),注意:
<1>,无参构造函数的()里就不用写,有参的你就按照要求写。
<2>,无参也可以不写:base(),就是默认调用无参构造函数。
2,base调用父类有参构造函数
(1),创建有参父类和子类
class A
{
public A(string name)
{
Console.WriteLine("父类构造函数");
}
}
class B:A
{
public B(string abc) : base(abc)
{
Console.WriteLine("子类的构造函数");
}
}
class C:B
{
public C(string def) : base(def)
{
Console.WriteLine("继承子类的构造函数");
}
}
(2),程序主入口里实例化最终的子类
static void Main(string[] args)
{
C ASD = new C("base()");
Console.ReadLine();
}
(3),最后输出的效果
父类构造函数
子类的构造函数
继承子类的构造函数
(4),总结
<1>,在无参构造函数里,base可以不用写,但是在有参构造函数里面,base是必须要写的,而且还必须按照其要求来写.
<2>,我们实例化以后,执行本类型的构造函数之前,先执行父类的构造函数,输出结果是先调用的父类,然后才调用的子类.和无参构造函数一致.
(5),注意:
<1>,不管有没有参数,都会调用父类的构造函数
<2>,而在:base()中父类的参数名字可以跟子类的不一样,但是子类中的俩个参数名字必须一样