В C # я должен использовать string.Empty или String.Empty или "" для инициализации строки? - PullRequest
670 голосов
/ 04 ноября 2008

В C # я хочу инициализировать строковое значение пустой строкой.

Как мне это сделать? Каков правильный путь и почему?

string willi = string.Empty;

или

string willi = String.Empty;

или

string willi = "";

или что?

Ответы [ 29 ]

767 голосов
/ 04 ноября 2008

Используйте то, что вы и ваша команда считаете наиболее читабельным.

Другие ответы предполагают, что новая строка создается каждый раз, когда вы используете "". Это не так - из-за интернирования строк он будет создаваться либо один раз для сборки, либо один раз для домена приложения (или, возможно, один раз для всего процесса - не уверен на этом фронте). Эта разница незначительна - массово, массово незначительно.

Однако то, что вы считаете более читабельным, - это другое дело. Это субъективно и будет варьироваться от человека к человеку - поэтому я предлагаю вам выяснить, что нравится большинству людей в вашей команде, и все согласны с этим. Лично я нахожу "" легче читать.

Аргумент о том, что "" и " " легко ошибочно принимают друг за друга, на самом деле меня не касается. Если вы не используете пропорциональный шрифт (а я не работал с любыми разработчиками, которые это делают), довольно легко заметить разницу.

369 голосов
/ 19 октября 2009

На самом деле нет никакой разницы с точки зрения производительности и кода. При тестировании производительности они переходили от одного к другому, причем быстрее, чем у другого, и только на миллисекунды.

Глядя на закулисный код, вы действительно не видите никакой разницы. Единственная разница в IL, который string.Empty использует код операции ldsfld "" использует код операции ldstr, но это только потому, что string.Empty является статическим, и обе инструкции выполняют одно и то же. Если вы посмотрите на сборку, которая производится, она точно такая же.

C # код

private void Test1()
{
    string test1 = string.Empty;    
    string test11 = test1;
}

private void Test2()
{
    string test2 = "";    
    string test22 = test2;
}

код IL

.method private hidebysig instance void 
          Test1() cil managed
{
  // Code size       10 (0xa)
  .maxstack  1
  .locals init ([0] string test1,
                [1] string test11)
  IL_0000:  nop
  IL_0001:  ldsfld     string [mscorlib]System.String::Empty
  IL_0006:  stloc.0
  IL_0007:  ldloc.0
  IL_0008:  stloc.1
  IL_0009:  ret
} // end of method Form1::Test1
.method private hidebysig instance void 
        Test2() cil managed
{
  // Code size       10 (0xa)
  .maxstack  1
  .locals init ([0] string test2,
                [1] string test22)
  IL_0000:  nop
  IL_0001:  ldstr      ""
  IL_0006:  stloc.0
  IL_0007:  ldloc.0
  IL_0008:  stloc.1
  IL_0009:  ret
} // end of method Form1::Test2

Код сборки

        string test1 = string.Empty;
0000003a  mov         eax,dword ptr ds:[022A102Ch] 
0000003f  mov         dword ptr [ebp-40h],eax 

        string test11 = test1;
00000042  mov         eax,dword ptr [ebp-40h] 
00000045  mov         dword ptr [ebp-44h],eax 
        string test2 = "";
0000003a  mov         eax,dword ptr ds:[022A202Ch] 
00000040  mov         dword ptr [ebp-40h],eax 

        string test22 = test2;
00000043  mov         eax,dword ptr [ebp-40h] 
00000046  mov         dword ptr [ebp-44h],eax 
75 голосов
/ 04 ноября 2008

Лучший код - это вообще не код :

Фундаментальный характер кодирования заключается в том, что наша задача как программистов - признать, что каждое принятое нами решение является компромиссом. […] Начните с краткости. Увеличьте остальные размеры в соответствии с требованиями теста.

Следовательно, чем меньше кода, тем лучше код: предпочитайте от "" до string.Empty или String.Empty. Эти два в шесть раз длиннее без дополнительной выгоды - конечно, без дополнительной ясности, поскольку они выражают ту же самую информацию.

52 голосов
/ 26 августа 2011

Одно отличие состоит в том, что если вы используете синтаксис switch-case, вы не можете написать case string.Empty:, потому что он не является константой. Вы получаете Compilation error : A constant value is expected

Посмотрите эту ссылку для получения дополнительной информации: строка пустая Версус пустой кавычки

42 голосов
/ 04 ноября 2008

Я бы предпочел string String. выбор string.Empty вместо "" - это вопрос выбора одного и его сохранения. Преимущество использования string.Empty в том, что оно совершенно очевидно, что вы имеете в виду, и вы случайно не копируете непечатаемые символы, такие как "\x003", в своем "".

22 голосов
/ 04 ноября 2008

Я не собирался вмешиваться, но я вижу, что здесь выкидывают неверную информацию.

Я лично предпочитаю string.Empty. Это личное предпочтение, и я подчиняюсь воле любой команды, с которой работаю, в каждом конкретном случае.

Как уже упоминали некоторые другие, между string.Empty и String.Empty нет никакой разницы.

Кроме того, и это малоизвестный факт, использование "" вполне приемлемо. Каждый экземпляр «» в других средах создает объект. Однако .NET интернирует свои строки, поэтому будущие экземпляры будут извлекать ту же неизменную строку из внутреннего пула, и любое снижение производительности будет незначительным. Источник: Брэд Абрамс .

15 голосов
/ 04 ноября 2008

Я лично предпочитаю "", если нет веских причин для чего-то более сложного.

13 голосов
/ 04 ноября 2008

String.Empty и string.Empty эквивалентны. String - имя класса BCL; string - это его псевдоним C # (или ярлык, если хотите). То же, что и с Int32 и int. См. документы для дополнительных примеров.

Что касается "", я не совсем уверен.

Лично я всегда использую string.Empty.

10 голосов
/ 31 мая 2009

Почти каждый разработчик знает, что означает "". Я лично столкнулся со String.Empty в первый раз, и мне пришлось потратить некоторое время на поиск в Google, чтобы выяснить, действительно ли они являются точно такими же.

9 голосов
/ 30 апреля 2016

Эта тема довольно старая и длинная, поэтому извините, если это поведение упоминалось где-то еще. (И укажите мне ответ, который охватывает это)

Я обнаружил разницу в поведении компилятора, если вы используете string.Empty или двойные кавычки. Разница проявляется, если вы не используете строковую переменную, инициализированную string.Empty или двойными кавычками.

В случае инициализации с string.Empty, тогда Предупреждение компилятора

CS0219 - The variable 'x' is assigned but its value is never used

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

Такое поведение объясняется в статье о подключении по этой ссылке: https://connect.microsoft.com/VisualStudio/feedback/details/799810/c-warning-cs0219-not-reported-when-assign-non-constant-value

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

...