我希望在 C# 中实现模拟器。
我考虑的其中一件事是创建一个枚举所有与其字节值关联的操作码。但是,我想知道这是否不是一个好主意,考虑到我需要多长时间访问该字节值才能执行诸如将其用作查找表中的索引等操作。
当您将枚举转换为整数时,会发生什么?这是多么昂贵的手术?简单地将我的操作码定义为 const 字节的名称会更谨慎吗?
最佳答案
它非常便宜 - 它实际上是一个无操作,真的,假设枚举有一个 int
的基础类型开始(这是默认值)。例如,这是一个示例程序:
using System;
enum Foo { A, B, C };
class Test
{
static void Main()
{
Foo x = Foo.B;
int y = (int) x;
}
}
Main
的生成代码(未优化):
.method private hidebysig static void Main() cil managed
{
.entrypoint
// Code size 6 (0x6)
.maxstack 1
.locals init (valuetype Foo V_0,
int32 V_1)
IL_0000: nop
IL_0001: ldc.i4.1
IL_0002: stloc.0
IL_0003: ldloc.0
IL_0004: stloc.1
IL_0005: ret
} // end of method Test::Main
有效地转换是为了编译器 - 内存中的数据已经处于适当的状态,所以它只需要像复制 int 一样复制值
到 int
。
如果枚举的基础类型不是int
,则将枚举转换为int
与转换基础类型为 int
。例如,如果基础类型是 long
,您最终会得到类似 conv.i4
的结果,其方式与转换 long
的方式相同> 通常为 int
。
关于c# - 当您在 C# 中将枚举转换为 int 时,幕后会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6488884/