gpt4 book ai didi

c# - 无法理解枚举的行为

转载 作者:太空狗 更新时间:2023-10-29 23:07:20 25 4
gpt4 key购买 nike

我在 C# 中练习枚举,但我无法理解这些的输出

void Main()
{
MyEnum a = MyEnum.Top;
Console.WriteLine(a);
}

对于这个测试,我的枚举和输出是

enum MyEnum
{
Left, Right, Top, Bottom // Top
}

enum MyEnum
{
Left, Right, Top = 0, Bottom // Left
}

我以为在朗姆酒时间程序选择了值为 0 的第一项,为了确认这一点,我将值 0 分配给底部

enum MyEnum
{
Left, Right, Top = 0, Bottom = 0 // Bottom
}

然后我想也许程序选择了值为 0 的第一个项目但按字母顺序搜索所以我将 Top 更改为ATop 并更改了测试用例

void Main()
{
MyEnum a = MyEnum.ATop;
Console.WriteLine(a);
}

enum MyEnum
{
Left, Right, ATop = 0, Bottom = 0 // Bottom
}

enum MyEnum
{
Left, Right, ATop = 0, Bottom // Left
}

我知道没有人以这种方式使用枚举,但我想知道枚举的这种特殊行为。

最佳答案

您似乎已经知道编译器默认从零开始计数。

enum MyEnum
{
Left, Right, Top = 0, Bottom = 0 // Bottom
}

翻译成这个

.class nested private auto ansi sealed MyEnum
extends [mscorlib]System.Enum
{
.field public specialname rtspecialname int32 value__
.field public static literal valuetype X/MyEnum Left = int32(0)
.field public static literal valuetype X/MyEnum Right = int32(1)
.field public static literal valuetype X/MyEnum Top = int32(0)
.field public static literal valuetype X/MyEnum Bottom = int32(0)
}

运行时实际上大部分时间都与底层类型一起工作。所以有趣的是,这里是

static void Main()
{
MyEnum a = MyEnum.Top;
Console.WriteLine(a);

Console.ReadKey();
}

甚至不使用实际的枚举成员:

.method private hidebysig static 
void Main () cil managed
{
.maxstack 1
.entrypoint
.locals init (
[0] valuetype X/MyEnum a
)

IL_0000: nop
IL_0001: ldc.i4.0
IL_0002: stloc.0
IL_0003: ldloc.0
IL_0004: box X/MyEnum
IL_0009: call void [mscorlib]System.Console::WriteLine(object)
IL_000e: nop
IL_000f: call valuetype [mscorlib]System.ConsoleKeyInfo [mscorlib]System.Console::ReadKey()
IL_0014: pop
IL_0015: ret
}

它仅使用值 0。使用 Console.WriteLine 打印哪个名称的决定始于 System.Enum.ToString 并在 中达到高潮System.Type.GetEnumName(对象)

public virtual string GetEnumName(object value)
{
if (value == null)
{
throw new ArgumentNullException("value");
}
if (!this.IsEnum)
{
throw new ArgumentException(Environment.GetResourceString("Arg_MustBeEnum"), "enumType");
}
Type type = value.GetType();
if (!type.IsEnum && !Type.IsIntegerType(type))
{
throw new ArgumentException(Environment.GetResourceString("Arg_MustBeEnumBaseTypeOrEnum"), "value");
}
Array enumRawConstantValues = this.GetEnumRawConstantValues();
int num = Type.BinarySearch(enumRawConstantValues, value);
if (num >= 0)
{
string[] enumNames = this.GetEnumNames();
return enumNames[num];
}
return null;
}

如您所见,搜索要打印的名称的实际方法是通过字段名称(通过反射找到)进行二进制搜索。

这只是当前的实现,但可能会因不同的编译器和/或运行时版本而有所不同。语言规范不保证上述代码的任何特定顺序或结果。

关于c# - 无法理解枚举的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25717924/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com