Есть ли какая-то выгода объявить константу в локальной области видимости в C #? - PullRequest
7 голосов
/ 03 сентября 2010

Есть ли польза от объявления локальной переменной как "const", если я знаю, что не буду изменять ее значение?

Спасибо

Ответы [ 7 ]

5 голосов
/ 03 сентября 2010

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

т.е. следующее:

const int test = 4;
DoSomething(test);

Может быть скомпилировано как

DoSomething(4);

компилятором

Редактировать: Ответить на "постоянное распространение", поскольку поле для комментариев имеет ограничение размера

Использование ildasm для проверки между const и no const для выпуска с оптимизацией:

код

int test = 4;
Console.WriteLine(test*2);

Компилируется в

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       11 (0xb)
  .maxstack  2
  .locals init ([0] int32 test)
  IL_0000:  ldc.i4.4
  IL_0001:  stloc.0
  IL_0002:  ldloc.0
  IL_0003:  ldc.i4.2
  IL_0004:  mul
  IL_0005:  call       void [mscorlib]System.Console::WriteLine(int32)
  IL_000a:  ret
} // end of method Program::Main

В то время как

const int test = 4;
Console.WriteLine(test*2);

оптимизируется до

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       7 (0x7)
  .maxstack  8
  IL_0000:  ldc.i4.8
  IL_0001:  call       void [mscorlib]System.Console::WriteLine(int32)
  IL_0006:  ret
} // end of method Program::Main

Используется версия 2010 с оптимизацией.

Я выполнил поиск, чтобы узнать больше о постоянном распространении, и хотя это возможно, текущий компилятор не делает этого, как упоминалось здесь

5 голосов
/ 03 сентября 2010

Обычно вы используете const на протяжении всего вашего решения. Но выгода от использования в локальной области состоит в том, что вы знаете какое-то другое место в своей области, и вы не будете его менять. А также, если кто-то еще работает над этим кодом, он будет знать, что не следует его менять. Это делает вашу программу более удобной в обслуживании, потому что вам нужно поддерживать только const (даже если она находится в локальной области видимости)

3 голосов
/ 03 сентября 2010

Мне нравится делать это, когда я передаю индикатор булевого флага методу:

const bool includeFoo = true;
int result = bar.Compute(10, includeFoo);

Для меня это более читабельно, чем простая истина / ложь, для определения значения которой необходимо прочитать объявление метода.

3 голосов
/ 03 сентября 2010

Да. Вы защитите свой код от случайного изменения этой переменной.

2 голосов
/ 03 сентября 2010

Объявление local как const сообщит компилятору о вашем намерении, поэтому вы не сможете изменить значение вашей переменной в другом месте вашей функции.

1 голос
/ 03 сентября 2010

В дополнение к действительным ответам, вы не только сообщаете компилятору, что значение не изменится, но и быстро говорите всем, кто будет смотреть на ваш код.

0 голосов
/ 03 сентября 2010

В зависимости от случая использования ..

Например,

void Foo()
{
    const string xpath = "//pattern/node";

    new XmlDocument().SelectNodes(xpath);
}

в этом случае я думаю, что объявление const не имеет смысла

...