В .NET, в чем разница между String.Empty
и ""
, и являются ли они взаимозаменяемыми, или есть какие-то основные ссылки или проблемы локализации вокруг равенства, String.Empty
которые гарантируют, что это не проблема?
.net
double-quotes
string
JohnC
источник
источник
string.Empty
и каково было основание объявить этоreadonly
вместоconst
.Ответы:
В .NET до версии 2.0
""
создает объект, аstring.Empty
объект ref не создает , что делает егоstring.Empty
более эффективным.В версии 2.0 и более поздних версиях .NET все вхождения
""
ссылаются на один и тот же строковый литерал, что означает""
эквивалент.Empty
, но все же не так быстро, как.Length == 0
..Length == 0
это самый быстрый вариант, но.Empty
делает код немного чище.См. .NET спецификацию для получения дополнительной информации .
источник
string.IsNullOrEmpty( stringVar )
.string.Empty
является полем только для чтения, тогда как""
является постоянной времени компиляции. Места, где они ведут себя по-разному:Значение параметра по умолчанию в C # 4.0 или выше
Выражение регистра в операторе switch
Аргументы атрибута
источник
String.Empty
качестве аргумента в большинстве случаев. Вы правы, что все примеры показывают это,you simply can't put a (run-time) "value" into (compile-time) metadata
и это то, что примеры стремятся показать.Предыдущие ответы были правильными для .NET 1.1 (посмотрите дату поста, на который они ссылались: 2003). Начиная с .NET 2.0 и более поздних версий, по сути, нет никакой разницы. JIT все равно будет ссылаться на один и тот же объект в куче.
Согласно спецификации C #, раздел 2.4.4.5: http://msdn.microsoft.com/en-us/library/aa691090(VS.71).aspx
Кто-то даже упоминает об этом в комментариях к посту Брэда Абрама
Таким образом, практический результат "" против String.Empty равен нулю. JIT выяснит это в конце.
Лично я обнаружил, что JIT намного умнее меня, и поэтому я стараюсь не слишком умничать с оптимизацией микрокомпилятора, подобным этому. JIT развернется для циклов (), удалит избыточный код, встроенные методы и т. Д. Лучше и в более подходящее время, чем когда-либо мог предвидеть компилятор I или C #. Пусть JIT сделает свое дело :)
источник
String.Empty
поле только для чтения, в то время""
как const . Это означает, что вы не можете использоватьString.Empty
в операторе switch, потому что это не константа.источник
default
ключевого слова мы можем повысить удобочитаемость, предотвратить случайное изменение и иметь постоянную времени компиляции, хотя, если честно, я все еще думаю, что String.Empty более читабелен, чем по умолчанию, но медленнееДругое отличие состоит в том, что String.Empty генерирует больший код CIL. Хотя код для ссылки "" и String.Empty имеет одинаковую длину, компилятор не оптимизирует конкатенацию строк (см. Сообщение в блоге Эрика Липперта ) для аргументов String.Empty. Следующие эквивалентные функции
генерировать этот IL
источник
"bar " + (ok ? "" : "error")
Приведенные выше ответы являются технически правильными, но то, что вы действительно хотите использовать для лучшей читабельности кода и наименьшей вероятности исключения, - это String.IsNullOrEmpty (s)
источник
--foo=$BAR
вы, вероятно, захотите заметить разницу между ними, забывшими установить env var, и с тем, чтобы они вообще не передавали флаг.string.IsNullOrEmpty
Это часто является запахом кода, который вы не проверили правильно, или делаете странные вещи. Вы не должны обычно принимать пустые строки, когда вы действительно хотите их использоватьnull
, или что-то вроде типа Maybe / Option.Я склонен использовать,
String.Empty
а не""
по одной простой, но не очевидной причине:""
и""
это НЕ одно и то же, первый фактически содержит 16 символов нулевой ширины. Очевидно, что ни один компетентный разработчик не собирается добавлять символы нулевой ширины в свой код, но если они туда попадут, это может стать кошмаром обслуживания.Ноты:
Я использовал U + FEFF в этом примере.
Не уверен, что SO будет есть эти символы, но попробуйте сами с одним из множества символов нулевой ширины.
Я только столкнулся с этим благодаря https://codegolf.stackexchange.com/
источник
Используйте,
String.Empty
а не""
.Ссылка:
String.Empty
против""
источник
String.Empty не создает объект, тогда как "" создает. Однако разница, как указано здесь , тривиальна.
источник
Все экземпляры "" являются одинаковыми интернированными строковыми литералами (или они должны быть). Таким образом, вы действительно не будете бросать новый объект в кучу каждый раз, когда используете «», а просто создаете ссылку на тот же самый интернированный объект. Сказав это, я предпочитаю строку. Пусто. Я думаю, что это делает код более читабельным.
источник
Это просто не имеет значения!
Некоторое прошлое обсуждение этого:
http://www.codinghorror.com/blog/archives/000185.html
http://blogs.msdn.com/brada/archive/2003/04/22/49997.aspx
http://blogs.msdn.com/brada/archive/2003/04/27/50014.aspx
источник
ldstr
выдвигает новую ссылку на объект на строковый литерал, хранящийся в метаданных.ldsfld
помещает значение статического поля в стек оценкиЯ склонен использовать
String.Empty
вместо,""
потому что ИМХО это более понятно и меньше VB-иш.источник
Вот некоторые результаты Roslyn x64 по состоянию на январь 2019 года. Несмотря на консенсусные замечания других ответов на этой странице, мне не кажется, что текущий JIT x64 рассматривает все эти случаи одинаково, когда все сказано и сделано.
Тем не менее, обратите внимание, что только один из этих примеров на самом деле заканчивается вызовом
String.Concat
, и я предполагаю, что это по неясным причинам правильности (в отличие от контроля за оптимизацией). Другие различия, кажется, труднее объяснить.default (String) + {default (String), "", String.Empty}
"" + {default (String), "", String.Empty}
String.Empty + {default (String), "", String.Empty}
Детали теста
источник
Исходя из этого, с точки зрения Entity Framework: версии EF 6.1.3, по-видимому, обрабатывают String.Empty и "" по-разному при проверке.
string.Empty обрабатывается как нулевое значение для целей проверки и выдает ошибку проверки, если она используется в поле Обязательное (приписывается); где как "" пройдет валидацию и не выдаст ошибку.
Эта проблема может быть решена в EF 7+. Ссылка: - https://github.com/aspnet/EntityFramework/issues/2610 ).
Редактировать: [Обязательный (AllowEmptyStrings = true)] решит эту проблему, позволив string.Empty для проверки.
источник
Поскольку String.Empty не является константой времени компиляции, вы не можете использовать ее в качестве значения по умолчанию в определении функции.
источник
public void test(int i=0, string s=string.Empty) {}
не скомпилирует и скажет "Значение параметра по умолчанию для 's' должно быть константой времени компиляции. Ответ OP работает.Когда вы визуально сканируете код, "" выглядит раскрашенным так, как раскрашиваются строки. string.Empty выглядит как обычный доступ к членам класса. Во время быстрого просмотра легче определить "" или интуитивно понять значение.
Определите строки (колоризация переполнения стека не совсем помогает, но в VS это более очевидно):
источник
\u00ad
.Все здесь дали некоторые хорошие теоретические разъяснения. У меня было подобное сомнение. Поэтому я попробовал базовую кодировку на нем. И я нашел разницу. Вот в чем разница.
Таким образом, кажется, что «Null» означает абсолютно void, а «String.Empty» означает, что оно содержит какое-то значение, но оно пустое.
источник
""
противstring.Empty
. Только при попытке узнать, пуста ли строка,null
было упомянуто.