string.Empty vs null. Какой из них вы используете? - PullRequest
79 голосов
/ 14 июля 2011

Недавно коллега на работе сказал мне не использовать string.Empty при установке строковой переменной, а использовать null, поскольку она загрязняет стек?

Он говорит, что не надо

string myString=string.Empty; но делают string mystring=null;

Это действительно имеет значение?Я знаю, что строка - это объект, поэтому он имеет смысл.

Я знаю, что это глупый вопрос, но каково ваше мнение?

Ответы [ 5 ]

102 голосов
/ 14 июля 2011

null и Empty очень разные, и я не предлагаю произвольное переключение между ними.Но ни одна из них не имеет дополнительной «стоимости», поскольку Empty является единственной фиксированной ссылкой (вы можете использовать ее любое количество раз).

В стеке нет «загрязнения», вызванного ldsfld - это беспокойство .... сумасшедшее.Загрузка null возможно незначительно дешевле, но может привести к исключениям нулевой ссылки, если вы не будете осторожны при проверке значения.

Лично я используюни ... Если я хочу пустую строку, я использую "" - просто и очевидно.Interning означает, что также не имеет накладных расходов на использование.


На уровне IL разница между "" и Empty здесь просто ldstr vs ldsfld - но оба дают одно и то жессылка на одиночную интернированную строку.Кроме того, в более поздних версиях .NET JIT имеет прямой перехват этих данных, что приводит к пустой ссылке на строку без , фактически выполняющей поиск статического поля.В принципе, нет абсолютно никаких причин для беспокойства, кроме читабельности.Я просто использую "".

28 голосов
/ 14 июля 2011

Это не «загрязняет стек», нет технической причины, но есть большая разница между установкой переменной для ссылки на объект (даже если это пустая строка) и null.Они не одно и то же и должны использоваться по-разному.

null следует использовать для указания на отсутствие данных, string.Empty (или "") для указания на наличие данных, вНа самом деле какой-то пустой текст.Есть ли конкретный случай, когда вы не уверены, что является наиболее подходящим?

Изменить, добавлены примеры:

  • Вы можете использовать string.Empty в качестве постфикса по умолчаниюдля имени человека (например, большинство людей не имеют докторской степени)

  • Вы можете использовать null для параметра конфигурации, который не был указан в файле конфигурации.В этом случае string.Empty будет использоваться, если присутствует опция конфигурации, но желаемым сконфигурированным значением была пустая строка.

8 голосов
/ 08 мая 2013

Они разные, как уже отвечали другие.

static void Main(string[] args)
{
    string s1 = null;
    string s2 = string.Empty;
    string s3 = "";
    Console.WriteLine(s1 == s2);
    Console.WriteLine(s1 == s3);
    Console.WriteLine(s2 == s3);
}

 results:
 false     - since null is different from string.empty
 false     - since null is different from ""
 true      - since "" is same as string.empty

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

Для сохранения строк в файл или сообщения:
Возможно, вы захотите преобразовать строку в байты.
Рекомендуется добавлять 2 сегмента байтов заголовка в преобразованную строку.

сегмент 1 - метаинформация, которая хранится в 1 байте и описывает длину следующего сегмента.

сегмент 2 - содержит длину сохраняемой строки.

Пример:
строка "abcd" - для упрощения я конвертирую ее с помощью ASCII-кодера и получу {65,66,67,68}.
2-й сегмент вычисления даст 4, поэтому 4 байта являются длиной преобразованной строки.
вычисление сегмента 1 даст 1 - так как только 1 байт использовался для хранения информации о длине преобразованной строковой информации (то есть 4, то есть если бы это было 260, я бы получил 2)

Новая полоса байтов теперь будет {1,4,65,66,67,68}, которую можно сохранить в файл.

Преимущество по отношению к предмету состоит в том, что если бы у меня была пустая строка для сохранения, я получил бы от преобразования пустой массив байтов длиной 0, и после вычисления сегментов у меня получилось бы {1,0} который может быть сохранен, а затем загружен и интерпретирован обратно в пустую строку. С другой стороны, если бы у меня было нулевое значение в моей строке, я бы в итоге имел только {0} в качестве моего байтового массива для сохранения, и снова при загрузке можно интерпретировать обратно как ноль.

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

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

1 голос
/ 28 сентября 2016

Ответ был получен до смерти, но ноль означает отсутствие значения, не инициализирован. string.Empty означает «» (пустая строка), как указано в MSDN.

Самый безопасный способ проверить наличие пустой или нулевой строки - использовать string.IsNullOrEmpty.

0 голосов
/ 08 февраля 2012

FWIW, я обнаружил, что смешивание "" и String.Empty не работает:

var a = "";
alert("a " + (a == "") + ", " + (a==String.Empty));   //Yields "a true, false"

var b = String.Empty;
alert("b " + (b == "") + ", " + (b == String.Empty)); //Yields "b false, true"

В частности, если вы используете $.trim, чтобы получить значение пустого поля ввода DOM, а затем сравнить его с String.Empty, вы получите false. Не уверен, почему это так, но вы идете. Я сейчас просто использую "" везде для согласованности.

...