Недавно коллега по работе сказал мне не использовать string.Empty
при установке строковой переменной, а использовать, null
поскольку она загрязняет стек?
Он говорит, не делай
string myString=string.Empty;
но делать string mystring=null;
Это действительно важно? Я знаю, что строка - это объект, поэтому в этом есть смысл.
Я знаю, это глупый вопрос, но каково ваше мнение?
string.Empty
,""
иnull
- все постоянные значения, но все они достаточно "простые", поэтому я не понимаю, почему вы назначаете одно значение переменной. Если вам нужно захватитьout
переменную, почему бы просто не использоватьstring myString;
?String.Empty
; если вы не знаете, есть ли у кого-то второе имя, которое вы используетеnull
). Затем, когда у вас будет правильное значение, напишите код таким образом, чтобы он был четко правильным и легко поддерживаемым.Ответы:
null
иEmpty
очень разные, и я не предлагаю произвольно переключаться между ними. Но ни то, ни другое не имеет дополнительной «стоимости», посколькуEmpty
это единственная фиксированная ссылка (вы можете использовать ее любое количество раз).В стеке нет «загрязнения», вызванного ldsfld - это ... безумное беспокойство. Загрузка,
null
возможно, немного дешевле, но может вызвать исключения с нулевой ссылкой, если вы не будете осторожны при проверке значения.Лично я не использую ни то, ни другое ... Если мне нужна пустая строка, я использую
""
- просто и очевидно. Интернирование означает, что это также не имеет накладных расходов на использование.На уровне IL разница между "" и Empty здесь просто ldstr vs ldsfld, но оба дают одну и ту же ссылку на одну интернированную строку. Более того, в более поздних версиях .NET JIT имеет прямой перехват их, давая ссылку на пустую строку без фактического поиска в статическом поле. По сути, в любом случае нет причин для беспокойства, кроме удобочитаемости. Я просто использую "".
источник
""
вместо стандартного кода в шесть раз длиннее. Кто пропагандировал эту чушь ?! @Jalal Эта публикация Брэда Абрамса серьезно устарела, и если компилятор все еще не оптимизирует эти два кода, чтобы сделать то же самое, то позор Microsoft! Но исправлять их работу - не наша работа. И на самом деле нам это не нужно: во второй ссылке Лассе (в комментариях) сравнил результаты сборки сравнения с любым вариантом: они идентичны.""
он будет искать весь пул, чтобы проверить, есть ли он там или нет, и именно так при использованииstring.Empty;
он будет использовать это предопределенное значение, и поиск больше не будет. класс также предоставил эти методы:string.Intern/IsInterned
проверьте этоЭто не «загрязняет стек», нет никаких технических причин, но есть большая разница между установкой переменной для ссылки на объект (даже если это пустая строка) и
null
. Это не одно и то же, и их следует использовать по-разному.null
следует использовать для обозначения отсутствия данных,string.Empty
(или""
) для обозначения наличия данных, фактически некоторого пустого текста. Есть ли конкретный случай, когда вы не уверены, что является наиболее подходящим?Отредактировал, добавил примеры:
Вы можете использовать
string.Empty
постфикс по умолчанию для имени человека (например, у большинства людей нет докторской степени)Вы можете использовать
null
для параметра конфигурации, который не был указан в файле конфигурации. В этом случаеstring.Empty
будет использоваться, если параметр конфигурации присутствует, но желаемое настроенное значение представляет собой пустую строку.источник
string.Empty
или,""
когда вы хотите использовать пустую строку иnull
когда вы хотите указать, что данных нет. Вы можете использоватьstring.Empty
постфикс по умолчанию для имени человека (например, у большинства людей нет докторской степени) иnull
для параметра конфигурации, который не был указан в файле конфигурации. Во втором случаеstring.Empty
будет использоваться, если параметр конфигурации присутствует, но желаемое настроенное значение представляет собой пустую строку.null
для обозначения «без постфикса»?Они разные, поскольку другие уже ответили.
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 действительно занимает больше памяти, чем null, хотя я бы не стал назовите это загрязнением .. это просто еще 1 байт.
источник
На него ответили до смерти, но null означает отсутствие значения, не инициализированный. string.Empty означает "" (пустая строка), как указано в MSDN.
Самый безопасный способ проверить наличие пустой или нулевой строки - использовать string.IsNullOrEmpty.
источник
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
. Не уверен, почему это так, но поехали. Я сейчас просто использую""
везде для единообразия.источник
.Length==0
или использовать.Compare()