猿问

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

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


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


如果我写


class C {

   void f() {

     const int i = 0;

   }

}

会慢吗


class C {

  const int i = 0;

  void f() {}

}


在第一种情况下,i每次调用时都会实例化变量f()吗?还是在编译期间仅实例化一次?


翻阅古今
浏览 252回答 1
1回答

SMILET

在第一种情况下,我每次调用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表示形式中的常量的几个字节几乎不可能是有效的。(它不是按对象或方法调用分配的。)
随时随地看视频慕课网APP
我要回答