一周学C#_第6天
枚举
1 类型
值类型
l 变量直接包含它们自己的数据
l 局部变量总是放在栈stack中
引用类型
n 变量间接指向它们的数据
n 局部变量指向堆heap中的对象
枚举enum |
值类型 |
结构struct |
值类型 |
类class |
引用类型 |
接口interface |
引用类型 |
数组[]array |
引用类型 |
委托delegate |
引用类型 |
C#规定,类如int、double等内在类,属于结构,C#称之为“简单类型”。
简单类型与自定义类型的最大区别在于:简单类型有字面表达式;而自定义类型没有。
还有,第三种类型:指针。指针只能用在unsafe块(非安全代码)中。
2 枚举类型
枚举类型是一个用户声明的值类型
enum Suit
{
Clubs, Diamonds, Hearts, Spades
}//Suit表示一副牌,有4中花色:梅花,方块,红心,黑桃
sealed class Example
{
static void Main()
{
...
Suit lead=Spades;//这里错误
...
Suit trumps=Suit.Clubs;//这样才正确
...
}
}
枚举声明:
可以出现中类声明的相同地方
包括:名字、访问权限、内在的类型和枚举的成员。
其中的变量的作用范围是定义它的枚举
Suit trumps=Clubs;//这是错误的,必须将Clubs限定为Suit的一个成员,如下
Suit trumps=Suit.Clubs;
3 枚举的注意事项
枚举值缺省类型为int
可以选择任一一个内在的整数类型
但是不能是字符型
enum Suit:int//内在类型为int,可以省略
{
Clubs,
Diamonds,
Heart=42,//成员默认取值为前一个成员值+1,但是也可以自己赋初始值
Spades,//最后一个成员的分号是可选的
};//结尾分号也是可选的
枚举类型中的内在变量可以显式声明的类型包括:sbyte, byte, short, ushort, int, uint, long,ulong.
如果没有显式声明,默认的类型为int。
成员的取值必须和枚举声明的内在类型相同。并且,必须在内在类型的范围之内。
如果没有给成员赋值,其取值为前一成员值+1,第一成员默认值为1。
枚举成员的取值可以是相同值。
最后一个枚举成员可以用逗号结尾
枚举成员默认访问权限是public。
4 使用枚举
枚举类型隐式的派生自System.Enum
namespace System
{
public abstract class Enum
{
//静态函数
public static string[] GetNames(Type);
...
//实例函数
public override string ToString();
//构造函数
protected Enum();
}
}
Suit trumps=Suit.Clubs;
string[] names=System.Enum.GetNames(trumps.GetType());
...
Console.Write(names[0]);//Clubs
Console.Write(trumps);//Clubs
Console.Write(“{0}”,trumps);//Clubs
Console.Write(trumps.ToString());//Clubs
Console.Write((Suit)24);//24
System.Enum是System命名空间的一个抽象类。它实现类一系列的接口:
public abstract class Enum:IComparable,IFormattable,IConvertible
{...}
枚举隐式派生于System.Enum
System.Enum只能被用来作为一个枚举类型的隐含基类。
不能显式的从System.Enum派生自己的类。
不能创建System.Enum类的实例。
5 枚举的操作符
枚举变量被当做整数变量来看待。
但在大部分情况下不能使用移位操作符。
6 枚举的转换
隐式转换
l 0可以转为任一enum类型
l 从不抛出错误
显式转换
l 从enum到enum通过内在类型转换
l 从enum转为数值类型(包含char)
l 从数值类型(包括char)转为enum
l 从不抛出错误
0可以被转为任一enum类型,不管此enum类型是否包括0。