在C#中将枚举转换为int时会发生什么?

Soj*_*oji 4 .net c# enums casting

我想在C#中实现一个模拟器.

我考虑的一件事是创建一个与其字节值相关的所有操作码的枚举.但是,我想知道这是不是一个好主意,考虑我是否经常需要访问该字节值来执行诸如将其用作查找表中的索引等等.

当你将枚举转换为int时,会发生什么?手术有多贵?简单地将我的操作码按名称定义为const字节会更为谨慎吗?

Jon*_*eet 9

这是非常便宜的 - 它实际上是一个无操作,真的,假设枚举有一个基础类型的int开始(这是默认的).例如,这是一个示例程序:

using System;

enum Foo { A, B, C };

class Test
{
    static void Main()
    {
        Foo x = Foo.B;
        int y = (int) x;
    }    
}
Run Code Online (Sandbox Code Playgroud)

并生成的代码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
Run Code Online (Sandbox Code Playgroud)

有效的演员阵容为着想编译器 -在内存中的数据已经是一个合适的状态,所以它只是需要复制就像它会复制一个值intint.

如果枚举的基础类型不是 a int,则将枚举转换为int具有与转换基础类型相同的效果int.例如,如果基础类型是long,那么你最终会得到类似于正常conv.i4投射的long方式int.


Mar*_*ell 5

它取决于枚举本身是否基于 int; p

如果是,没有任何反应 - 枚举完全以他们int/ long任何形式表示,直到你装箱.从MyEnum : int<===>转换int是无操作.您在方法重载解析等方面熟悉的大多数区别纯粹存在于编译器中; 在IL级别,没有任何区别.