c# - 当您在 C# 中将枚举转换为 int 时,幕后会发生什么?

标签 c# .net enums casting

我希望在 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/

相关文章:

c# - 禁用 Windows 窗体关闭按钮

c# - 您知道执行此 "massive"linq 过滤的另一种方法吗?

c# - 如何在 xaml 中应用多个数据上下文?

.net - F# 相当于 Eval

java - 评估 switch 中的枚举

java - Java Enum 与 C++ 和其他传统 Enum 有何不同?

java - 如何检查对象列表中是否存在枚举值

c# - 如何从 KeyValuePair 列表中进行选择?

c# - 动态创建嵌套转发器控件

c# - 按 unicode 类别拆分字符串