为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
翻阅古今 2021-04-29 13:45:48
在C#中的方法内部使用常量是否正常?我的意思是,使用常量作为类属性比使用常量作为方法内部的变量有什么好处吗?如果我写class C {   void f() {     const int i = 0;   }}会慢吗class C {  const int i = 0;  void f() {}}?在第一种情况下,i每次调用时都会实例化变量f()吗?还是在编译期间仅实例化一次?
查看完整描述

1 回答

?
SMILET

TA贡献1796条经验 获得超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表示形式中的常量的几个字节几乎不可能是有效的。(它不是按对象或方法调用分配的。)


查看完整回答
反对 回复 2021-05-08
  • 1 回答
  • 0 关注
  • 251 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信