目录
枚举
● 枚举是由程序员自定义的类型:
与结构一样,枚举是值类型, 因此直接存储它们的数据,而不是分开存储引用和数据。
枚举只有一种类型的成员: 命名的整数值常量。
● 枚举: 允许定义一个 枚举类型名,然后用枚举类型名声明的变量,其变量的值只能取自 括号内的这些标识符。
enum 枚举类型标识符 : 可取的基本类型
{
//枚举成员常量
}
注意:如果没有写可取的基本类型, 默认情况下该类型为int。 枚举的基本类型可以是: byte sbyte short ushort int uint long ulong. 枚举的类型是任何整数类型。
其中,每个枚举成员常量都被赋予一个底层类型的常量值。 该成员常量的值可以是可取的基本类型的该类型的任何值。
在默认情况下, 编译器把每一个成员赋值为0,并对每一个后续成员赋的值比前一个成员多1.
要显式地设置一个成员的名称,在枚举声明中的变量名之后使用初始化表达式。 尽管不可以有重复的名称,但是可以有重复的值。或者说 还可以使用一个值(枚举常量)作为另一个枚举(枚举常量)的基础值,为多个枚举指定相同的值(不过要注意的是: 这里可能产生预料不到的问题。).(C++中不可以这样):
namespace Ch05Ex03
{
enum Light:uint
{
value1=22,
value2,
value3 = value1,
value4,
value5=22
}
class Program
{
static void Main(string[] args)
{
Light myLight1 = Light.value1;
Light myLight2 = Light.value2;
Light myLight3 = Light.value3;
Light myLight4 = Light.value4;
Light myLight5 = Light.value5;
Light myLight6 = myLight5; // 还可以使用同类型的枚举变量复制值,myLight6 是 myLight5 的副本
WriteLine($"输出myLight1的值 {myLight1}——{(int)myLight1}");
WriteLine($"输出myLight2的值:{myLight2}——{(int)myLight2}");
WriteLine($"输出myLight3的值:{myLight3}——{(int)myLight3}");
WriteLine($"输出myLight4的值:{myLight4}——{(int)myLight4}");
WriteLine($"输出myLight5的值:{myLight5}——{(int)myLight5}");
WriteLine($"输出myLight6的值:{myLight6}——{(int)myLight6}");
ReadKey();
}
}
}
输出结果为:
输出myLight1的值 value5——22
输出myLight2的值:value4——23
输出myLight3的值:value5——22
输出myLight4的值:value4——23
输出myLight5的值:value5——22
输出myLight6的值:value5——22
注意: 以循环的方式赋值可能会产生错误。
enum Light:uint
{
value2 = value1, //错误
value1 = value2,
}
枚举值与整型值的转换
namespace HelloWorld_Console
{
enum orientation : byte
{
north = 1,
south = 2,
east = 3,
west = 4
}
class Program
{
static void Main(string[] args)
{
orientation myDirection = orientation.north;
WriteLine($"myDirection = {myDirection}");
WriteLine(orientation.north);
ReadKey();
}
}
}
输出结果为:
myDirection = north
north
仔细看这个程序当我们输出枚举类型创建的变量时输出的值是枚举成员的枚举值,而不是整数值。如果想把枚举值变成整数值,需要显式转换。
下面看一个程序枚举值转换整数值:
namespace HelloWorld_Console
{
enum orientation : byte
{
north,
south,
east = 3,
west = 4
}
class Program
{
static void Main(string[] args)
{
orientation myDirection = orientation.north;
WriteLine($"myDirection = {myDirection}");
// 把 myDirection 的值转换为 byte 类型,必须用显式转换
byte directionByte = (byte)myDirection;
string directionString = Convert.ToString(myDirection); // 也可以使用变量本身的myDirection.ToString() 命令,效果相同;
WriteLine($"byte equivalent = {directionByte}");
WriteLine($"string equivalent = {directionString}");
//将byte 类型转换为 orientation,也同样需要进行显式转换。
byte myByte = 4; //如果这里写7,即超过了枚举列表中的值,就会直接输出7,不会转换
myDirection = (orientation)myByte;
WriteLine($"string equivalent = {myDirection}\n");
string myString = " west "; //这里只能写枚举常量中的任何一个枚举值,否则的话,错误
orientation myDirection11 = (orientation)Enum.Parse(typeof(orientation), myString);
WriteLine($"把mystring 的值转换成枚举值:{myDirection11}");
ReadKey();
}
}
}
输出结果为:
myDirection = north
byte equivalent = 0
string equivalent = north
string equivalent = west
把mystring 的值转换成枚举值:west
注意: 枚举类型变量的取值范围只可以是 枚举中的枚举常量列表中的任何一个, 不可以是除了枚举常量的其他值。
在本例中虽然 orientation 的基本类型是 byte , 但是必须使用(byte) 强制类型转换, 把 myDirection 的值转换为 byte 类型。
同理, 如果要将byte 类型转换为 orientation,也同样需要进行显式转换。
● 要获得枚举的字符串值,可以使用 Convert.ToString();
注意: 这里使用 (string) 强制类型转换是不行的,因为需要进行的处理并不仅是把存储在枚举变量中的数据放在string 变量中。
还可以使用变量本身的ToString() 命令, 效果一样:
directionString = myDirection.ToString();
● 也可以把 string 转换为,枚举值, 使用 Enum.Parse() , 语法为:
(枚举的类型)Enum.Parse(typeof(枚举的类型),要转换的string变量)
例如:
string myString = " west "; //这里只能写枚举常量中的任何一个枚举值,否则的话,错误
orientation myDirection11 = (orientation)Enum.Parse(typeof(orientation), myString);
WriteLine($"把mystring 的值转换成枚举值:{myDirection11}");
运算符typeof 可以得到操作数的类型。
注意: 并非所有的字符串值都会转换为一个 orientation 值。 如果传送的值不能转换为枚举值中的一个,就会产生错误。与C# 中的其他值一样,这些值是区分大小写的, 所以如果字符串与一个值相同,但大小写不同(例如,将myString 设置为 North 而不是 north),就会产生错误。
C++中的枚举和C#的枚举的区别
在C++中的枚举常量的值不可以重复, 即不可以初始化一样的值。一个枚举常量也不可以初始化另一个枚举常量。 在c# 中可以。
在C++中允许设定部分枚举常量对应的整数常量值, 但是要求从左到右依次设定枚举常量对应的整数常量值,并且不能重复。 在C#中可以。
在C++中,输出值时可以直接引用枚举常量名称, 但是C#中不可以,必须添加 “ 枚举.枚举常量名称 ”。
其实还要很多区别,这里就不写了,自己慢慢发现把。