const值实例化方法C#中的性能

时间:2018-04-22 11:47:31

标签: c# const

在C#中的方法中使用常量是否正常?

我的意思是使用常量作为类属性比使用常量作为方法中的变量有什么好处吗?

如果我写

class C {
   void f() {
     const int i = 0;
   }
}

会慢于

class C {
  const int i = 0;
  void f() {}
}

每次调用i时,第一种情况变量f()都会被实例化吗?或者在编译期间只会实例化一次?

1 个答案:

答案 0 :(得分:4)

  

在每次调用f()时,我会在第一个案例变量中实例化吗?或者在编译期间只会实例化一次?

最简单的方法是尝试它。例如,编译此代码:

using System;

class Test
{
    const int ClassConst = 10;

    static void PrintLocalConst()
    {
        const int LocalConst = 10;
        Console.WriteLine(LocalConst);
        Console.WriteLine(LocalConst);
    }

    static void PrintClassConst()
    {
        Console.WriteLine(ClassConst);
        Console.WriteLine(ClassConst);
    }
}

两种方法都编译为相同的IL:

.method private hidebysig static void  PrintLocalConst() cil managed
{
  // Code size       18 (0x12)
  .maxstack  8
  IL_0000:  nop
  IL_0001:  ldc.i4.s   10
  IL_0003:  call       void [mscorlib]System.Console::WriteLine(int32)
  IL_0008:  nop
  IL_0009:  ldc.i4.s   10
  IL_000b:  call       void [mscorlib]System.Console::WriteLine(int32)
  IL_0010:  nop
  IL_0011:  ret
} // end of method Test::PrintLocalConst

本地常量的堆栈没有值;相反,每次使用时,常数值都直接包含在IL中 - 因此ldc.i4.s 10被使用了两次。

就此而言,本地const 非常,非常,非常轻微比类const更有效,因为类const仍然在IL中表示。编译器有效地完全删除了本地const。但是,IL表示中的常量的几个字节非常不可能是重要的。 (它不是基于每个对象或每个方法调用分配的。)