Должен ли я пытаться использовать константную строку вместо строки, где это возможно?

Рассмотрим эти три примера:

Пример А

string message = "Hello world!";
throw new System.Exception(message);

Пример Б

const string message = "Hello world!";
throw new System.Exception(message);

Пример С

throw new System.Exception("Hello world!");

Есть ли причина использовать один над другими? В частности, не должен ли я пытаться использовать константную строку, где это возможно (при условии, что строка никогда не изменяется), и поэтому пример B лучше всего? Что происходит в примере C?

Я думаю, я спрашиваю, идентичны ли IL, испускаемые выше, или разные, и есть ли какая-либо разница. Я понимаю, что разница будет небольшой и, вероятно, не о чем беспокоиться; Думаю, это делает этот вопрос академическим.


Редактировать. Вот ИЛ

IL_0014: ldstr "This is a string"
IL_0019: stloc.0
IL_001a: ldloc.0
IL_001b: newobj instance void [mscorlib]System.Exception::.ctor(string)
IL_0020: throw


IL_0033: nop
IL_0034: ldstr "This is a const string"
IL_0039: newobj instance void [mscorlib]System.Exception::.ctor(string)
IL_003e: throw

IL_0051: nop
IL_0052: ldstr "This is an inline string."
IL_0057: newobj instance void [mscorlib]System.Exception::.ctor(string)
IL_005c: throw

Выглядит по существу идентично мне.


person John Wu    schedule 07.11.2013    source источник
comment
бери декомпилятор и вперед!   -  person Jonesopolis    schedule 08.11.2013
comment
Я не понимаю, почему вы просто не смотрите на IL и не решаете для себя? На самом деле с правильными параметрами компилятора они должны получиться одинаковыми.   -  person Jasmine    schedule 08.11.2013
comment
Вопрос в нереальном сравнении яблок и апельсинов. B может быть только полем. A может быть полем или локальной переменной. C может быть объявлен только встроенным.   -  person P.Brian.Mackey    schedule 08.11.2013
comment
Вы можете сделать B в методе, но я обычно использую только поля как поля.   -  person Tony    schedule 08.11.2013


Ответы (2)


зависит от контекста, на самом деле. это сообщение когда-нибудь изменится? Если вы используете вариант A, у вас есть возможность изменить значение строкового сообщения, с двумя другими вы печатаете жестко закодированную строку - и это нормально, если он всегда будет говорить именно это

person nbpeth    schedule 07.11.2013

Нет никакой разницы в производительности, использовании памяти или эффективности таблицы строк.

Единственный эффект ключевого слова const — генерировать ошибку времени компиляции при переназначении строки. Поэтому полезно добавить const, чтобы сообщить о своих намерениях другим разработчикам.

person John Wu    schedule 12.11.2013