Расчетные константы в C # - PullRequest
6 голосов
/ 21 марта 2011

Доброе утро, день или ночь,

Заменит ли компилятор MSIL или JIT такие вещи, как 1 << 5 или 1 << 31 в коде, на 32 и 2147483648, соответственно, или будетони ждут выполнения метода, чтобы оценить эти константы «вовремя», так как они включают другие методы (операторы)?

Большое спасибо.

Ответы [ 3 ]

6 голосов
/ 21 марта 2011

Попробуйте.

Следующий код

    static void Main ( string[] args )
    {
        Console.WriteLine ( 1 << 4 );
    }

Получает скомпилированный в

  IL_0000:  nop
  IL_0001:  ldc.i4.s   16
  IL_0003:  call       void [mscorlib]System.Console::WriteLine(int32)
  IL_0008:  nop
  IL_0009:  ret

Он просто загружает константу 16 и передает ее в WriteLine.

5 голосов
/ 21 марта 2011

Да.Посмотрите на скомпилированный IL для программы, которая просто выполняет Console.WriteLine(1 << 5), и вы увидите, что она такая же, как для Console.WriteLine(32) или Console.WriteLine(0x20).То же самое касается множества других таких констант.

3 голосов
/ 21 марта 2011

(проверено) - фактически они приводят к одному и тому же вычисленному значению после компиляции, спецификация C # подтверждает:

10,4 Константы

Константа - это член класса, представляющий константу значение: значение, которое может быть вычислено во время компиляции. константное объявление вводит один или больше констант данного типа.

...