String.Empty vs null.Что вы используете?

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

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

string myString=string.Empty;, но do string mystring=null;

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

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

Ответ 1

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

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

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


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

Ответ 2

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

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

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

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

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

Ответ 3

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

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 - содержит длину строки, которую нужно сохранить.

Пример:
string "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 занимает больше памяти, чем null, хотя я не назвал бы это загрязнением.. это всего лишь 1 байт.

Ответ 4

Ему ответили до смерти, но null означает значение, а не инициализировано. string.Empty означает "" (пустая строка), как указано в MSDN.

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

Ответ 5

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. Не знаю, почему это так, но ты туда. Теперь я просто использую "" всюду для согласованности.