В C# следует ли использовать string.Empty или String.Empty или "" для инициализации строки?

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

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

string willi = string.Empty;

или же

string willi = String.Empty;

или же

string willi = "";

или что?

См. Также это аналогичное обсуждение для java: stackoverflow.com/questions/213985/…

harpo 04.11.2008 23:05

Что еще важнее, никогда не сравнивать строку с Sting.Empty. <br> Плохо: if (s == "") <br> Хорошо: if (s.Length == 0)

Pavel Radzivilovsky 21.12.2009 13:35

лучше использовать String.IsNullOrEmpty (string myString), хотя, конечно?

ZombieSheep 21.12.2009 13:36

Я использую [string.IsNullOrWhiteSpace (stringvalue)] ... работает в .Net 4.0. Для инициализации я просто использую: [var text = "";] Простой, читаемый и минимальный ввод времени :)

Jalal El-Shaer 07.10.2011 16:51

Что еще важнее, так это веселое имя вашей переменной.

Arj 29.11.2011 14:34

Что меня интересовало, так это то, почему существует даже свойство Empty. Это хорошо и все такое, но не обязательно.

MasterMastic 18.04.2012 18:28

возможный дубликат В чем разница между String.Empty и "" (пустой строкой)?

nawfal 29.06.2013 11:22

там был разница stackoverflow.com/questions/16618302/…

Logerfo 14.09.2017 15:24

@ZombieSheep Вы не можете использовать IsNullOrEmpty для установки значения строковой переменной ...

Stewart 26.02.2018 18:59

Также, если вы используете обфускацию кода. string.empty может быть запутан, а как "" не обфусцирован. Опять же, не большая разница и не имеет большого значения, если вы используете какую-то обфускацию, но это разница.

Jack 30.04.2018 21:45
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
736
10
252 462
30
Перейти к ответу Данный вопрос помечен как решенный

Ответы 30

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

Любой из вышеперечисленных.

Есть много-много лучших вещей, которые стоит проповедовать. Например, какой цвет коры лучше всего подходит дереву, я думаю, неопределенно-коричневый с оттенками мягкого мха.

Я использую третий, но из двух других первый кажется менее странным. string - это псевдоним для String, но видеть их в назначении кажется неприятным.

В конечном итоге компилятор должен сделать их одинаковыми. Выберите стандарт, чтобы ваш код было легко читать, и придерживайтесь его.

Я думаю, что второе «правильное», но, честно говоря, не думаю, что это будет иметь значение. Компилятор должен быть достаточно умен, чтобы скомпилировать любой из них в один и тот же байт-код. Я сам использую "".

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

Я бы сказал, что если вы случайно копируете непечатаемые символы в свой код, у вас проблемы посерьезнее, чем этот вопрос;)

Jon Skeet 04.11.2008 23:10

ASCII \ 003 является разделителем полей для сообщений B2B, с которыми я работал :)

Jimmy 05.11.2008 00:06

(Я бы также посоветовал избегать \ x escape, кстати - слишком сложно заметить разницу между "\ x9Bad Compiler" и "\ x9Good Compiler", у которых радикально разные результаты!)

Jon Skeet 05.11.2008 00:39

Лично я предпочитаю String при вызове статического метода для String. Однако я почти слепой, и это личное предпочтение, которое я никому не навязываю.

Brett Ryan 11.09.2009 08:42

Я бы, вероятно, объявил const над "\x003". :)

Andy 13.11.2012 00:07

Меня укусило нечто подобное, где у меня есть документ со строками с непечатаемыми символами в новом задании ... :)

Noctis 04.11.2014 09:43

Вы используете копирование / вставку для ввода "" ...?

Timo 10.11.2015 11:38

@Timo Не воспринимайте этот пример буквально. Представьте, что он копирует кусок текста со встроенными непечатаемыми символами из документации API.

Jimmy 11.11.2015 01:35

@ Джимми Конечно, но мы говорили о пустой строке. Я утверждаю, что аргумент о том, что "" опасен при копировании / вставке, недействителен, потому что вы никогда не копируете / вставляете пустую строку. Что касается других струн, это, конечно, всегда нужно помнить.

Timo 12.11.2015 12:11

Я не имею значения. Последний вариант набирать быстрее всего :)

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

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

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

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

[РЕДАКТИРОВАТЬ]

Кроме того, вы можете всегда использовать string или String для единообразия, но это только я.

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

EnocNRoll - AnandaGopal Pardue 28.01.2009 19:55

string является синонимом типа System.String, они идентичны.

Значения также идентичны: string.Empty == String.Empty == ""

Я бы не стал использовать символьную константу "" в коде, скорее string.Empty или String.Empty - проще понять, что имел в виду программист.

Между string и String мне больше нравится нижний регистр string просто потому, что я много лет работал с Delphi, а стиль Delphi - строчный string.

Итак, если бы я был вашим начальником, вы бы написали string.Empty

Неважно - это одно и то же. Однако главное, чтобы вы должен быть последовательным

p.s. Я все время борюсь с такими «правильными вещами».

В современном мире «согласованность» означает согласованность во всех командах по всему миру, что является одной из целей StackOverflow. Если можно, давайте воспользуемся String.Empty.

Pavel Radzivilovsky 21.12.2009 13:32

В некоторых языках нет константы Empty, и все языки, которые я могу придумать, допускают "" строку нулевой длины. Поэтому я голосую за "" для согласованности с другими языками. :)

TomXP411 18.07.2014 00:27

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

The fundamental nature of coding is that our task, as programmers, is to recognize that every decision we make is a trade-off. […] Start with brevity. Increase the other dimensions as required by testing.

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

но в C# мы можем просто сказать string.IsNullOrWhitespace (s): p

felickz 19.01.2012 19:04

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

Markus Meyer 28.03.2013 15:23

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

Konrad Rudolph 28.03.2013 15:29

@Konrad: i - хорошее имя переменной, только если цикл небольшой и не содержит никаких других индексов. Но я согласен, что если что-то. можно сформулировать более кратко, передав ту же информацию, которая была бы предпочтительнее, например, в случае string.Empty / "". Строка string.Empty не добавляет ясности.

Markus Meyer 28.03.2013 17:01

Для меня: string.Empty говорит, что эта строка всегда и должна быть пустой, тогда как "" говорит, что во время записи эта строка может быть пустой, но вы можете ее изменить.

aeroson 13.08.2017 16:59

@aeroson Не стесняйтесь интерпретировать все так, как вы хотите, но имейте в виду, что никто другой не поделится вашим весьма своеобразным чтением, и поэтому не полагайтесь на него для передачи намерений: никто этого не получит.

Konrad Rudolph 14.08.2017 12:55

@aeroson Строки неизменяемы, поэтому их нельзя менять. Если вы имеете в виду изменение того, что находится в Переменная, я бы не предполагал такого намерения из того, что изначально присвоено этой переменной.

Timo 24.09.2018 11:54

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

Dan Diplo 17.10.2018 18:32

@DanDiplo Вы не можете всерьез утверждать, что String.Empty более читабелен, чем "". Это просто не, и вопреки вашему утверждению нет никаких доказательств того, что разработчики фреймворка так думают (я не могу читать их мысли, но я почти уверен, что они так не думают, и что, если что-то, они, вероятно, видят его присутствие как ошибка в ретроспективе). Давайте поговорим с Эриком Липпертом - хотя шансы прочитать это, вероятно, невелики.

Konrad Rudolph 18.10.2018 04:04

@KonradRudolph В недавних примерах Microsoft для "Лучших практик использования строки в .NET Framework" используется String.Empty - см. docs.microsoft.com/en-us/dotnet/standard/base-types/…

Dan Diplo 18.10.2018 17:26

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

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

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

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

Я не понимаю, почему «технически» каждый экземпляр «» создает объект. Строки интернированы не случайно - это указано в спецификации C#.

Jon Skeet 04.11.2008 23:09
Ответ принят как подходящий

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

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

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

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

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

tvanfosson 04.11.2008 23:18

@tvanfosson: Значит, вас (или вашего коллегу) на самом деле укусила эта ошибка? Я с подозрением отношусь к подобным заявлениям, хотя на самом деле они не вызывают проблем. Я использую "" много лет, но ни разу не ошибся ...

Jon Skeet 04.11.2008 23:27

Джон, я использую Segoe UI 10 pt в VS. Красиво, вкладки в любом случае идеально выстраиваются, и таким образом у меня могут быть гораздо более длинные строки. Может я тогда не разработчик: D

Alan 04.11.2008 23:29

@Alan: Я попробую посмотреть, на что это похоже. Лично я использую пробелы вместо вкладок (и буду сражаться за это до смерти;), что, как я подозреваю, делает его менее эффективным для выравнивания параметров битов и т. д... тем не менее, стоит попробовать.

Jon Skeet 04.11.2008 23:50

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

tvanfosson 05.11.2008 01:19

Зачем рисковать? Потому что я считаю "" более читаемым, чем string.Empty. В противном случае я бы однозначно использовал последнее. Однако, учитывая определенные личные предпочтения по сравнению с риском потенциал, который меня никогда не укусил, я думаю, что разумно выбрать код, который команда считает наиболее читаемым.

Jon Skeet 05.11.2008 01:25

@Jon: Я тоже использую пробелы вместо табуляции, я имел в виду не буквальные табуляции, а отступы. Простите за это. И, пожалуйста, попробуйте - раньше я был поклонником Courier New / Monaco / Lucida Sans Typewriter, но однажды попробовал Segoe UI и никогда не оглядывался назад :)

Alan 05.11.2008 01:40

@Alan: На данный момент изменились. Можно использовать это для презентаций - приятно, чтобы на экране было больше, особенно когда шрифт весь взорван ...

Jon Skeet 05.11.2008 02:04

@Jon: Если вы прочтете мой ответ, вы увидите, что я выразил личное предпочтение, на мой взгляд, по разумной причине. Вы не согласны. Возможно, когда вам исполнится 40 и ваше зрение вблизи начнет ухудшаться, вы сможете изменить свою точку зрения. :-)

tvanfosson 05.11.2008 06:49

@tvanfosson: Я изменю свою точку зрения, когда увижу доказательства того, что это вызывает реальную, а не предполагаемую проблему :) Я думаю, что утверждение, что внести ошибку относительно легко, когда такой ошибки не было замечено, является преувеличением. Но да, это все личное мнение.

Jon Skeet 05.11.2008 15:35

Лично я всегда использовал String.Empty, я использую заглавную букву «S» всякий раз, когда хочу использовать статический метод для строки, это просто личное предпочтение, которое позволяет мне отличать тип от переменной. Но это всего лишь переход от использования StringUtils.EMPTY в commons.lang из java. Интересно то, что я почти слепой, и это определенно помогает мне с удобочитаемостью.

Brett Ryan 11.09.2009 08:34

@Brett: С другой стороны, в Visual Studio «строка» имеет другой цвет. Как вы говорите, это личное предпочтение ...

Jon Skeet 11.09.2009 09:24

Вы вдохновили меня начать разработку в Times New Roman.

Justin Rusbatch 21.02.2010 21:39

Я думаю, что «проблема» не в том, что это вводит ошибки (у меня этого тоже никогда не было), а в том, что это менее читаемый и что вам иногда нужно посмотри дважды, независимо от того, инициализирована ли строка как пустая строка "" или как пробел " ". Конечно, довольно редко строка инициализируется пробелом, но я все равно часто проверяю это бессознательно. Поэтому я всегда выбираю String.Empty, потому что он понятен с первого взгляда.

gehho 31.08.2010 10:52

@gehho: Ты считаю его менее читаемым - и это нормально - но я считаю его более читаемым, чем string.Empty. При использовании моноширинного шрифта разница между "" и "" для меня очень очевидна, а string.Empty излишне загроможден. Но на самом деле это просто личные предпочтения.

Jon Skeet 31.08.2010 11:54

@Jon: Абсолютно - личные предпочтения! Я просто хотел ответить на ваш комментарий от Nov 4 '08 at 20:27, где вы спрашиваете, вводил ли он когда-нибудь ошибку. Дело не в том, что он вносит ошибки, а в том, что мне (подсознательно) нужно больше времени, чтобы интерпретировать его (это (милли) секунды, но все же ...). И я думаю, что другие, кто упоминал этот случай (например, Тванфоссон и Бретт Райан), имели в виду именно это. Я не хотел убеждать вас использовать String.Empty - я просто хотел объяснить причину, по которой некоторые люди предпочитают его. :)

gehho 31.08.2010 13:46

① Я использую пропорциональный шрифт, и у меня нет проблем с отличием "" от " " (хотя, возможно, зависит от шрифта); ② Даже если бы их было трудно визуально различить, я думаю, что в целом из кода в контексте было бы ясно, какой именно код должен быть.

Timwi 16.09.2010 13:37

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

Roman Starkov 16.09.2010 13:48
"" не очень похож на " ", но его можно спутать с '"'.
Ben Voigt 18.11.2010 06:40

@Ben: Не могу сказать, что у меня когда-либо была проблема с этим ... тем более, что во многих случаях это было бы неверно из-за другого типа.

Jon Skeet 18.11.2010 09:32

Лично я считаю, что мой мозг использует гораздо меньше возможностей для интерпретации простого шаблона "", чем для String.Empty («эй, есть класс и свойство - что он делает?») Все, кто использует String.Empty, также используют String.Space (1 )? Если нет места, которое трудно различить, то одно или несколько также могут быть.

goodeye 08.01.2012 06:34

Единственная вероятная путаница - между одной двойной кавычкой и двумя одинарными кавычками ... ("vs '') == WTF!?!?! Любой" компетентный "программист одинаково легко справится с ЛИБО var s = " "ИЛИ var s = String.Empty. Но, читая комментарии здесь ... приятно видеть подтверждение того, что у других людей есть патологические, квазирелигиозные представления о стиле программы, которые на самом деле не имеют значения, черт возьми. Я думал, что был один . Вздох.

corlettk 17.02.2012 08:24

Самым большим преимуществом string.Empty является то, что вы можете более легко найти точное его использование в среде IDE, такой как Visual Studio. Простая операция поиска для "" вернет экранированные кавычки и "" представление в комментариях, а также варианты использования, которые вы действительно ищете. Выполнение типа проверки кода "поиска использования" string.Empty предоставит вам все возможности его использования в рамках всего решения, тогда как поиск использования строкового литерала (например, "") ограничен объемом сборки, которую он определено в.

MutantNinjaCodeMonkey 22.06.2012 22:28

@MutantNinjaCodeMonkey: Я не могу припомнить, чтобы когда-либо искал "" в кодовой базе, и если бы я это делал, то мое использование "" в комментариях или дословных строковых литералах достаточно мало, чтобы меня это сильно не беспокоило. Если это действительно самое большое преимущество string.Empty, IMO это довольно крохотный.

Jon Skeet 22.06.2012 22:50

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

ThunderGr 12.12.2012 15:54

Для некоторых непонятная причина, по которой string.Empty не является постоянной. Это означает, что в ряде случаев, когда требуется постоянная времени компиляции, string.Empty даже недопустим. Это включает блоки case "" в операторах switch, значения по умолчанию для необязательные параметры, параметры и свойства в применении атрибуты и множество других ситуаций (оставлено на усмотрение читателя). Поэтому, учитывая, что string.Empty запрещен в некоторых распространенных ситуациях, лучше использовать соглашение ""-везде.

Jeppe Stig Nielsen 11.05.2013 01:20

Я также разрабатываю на Javascript, VBScript, SQL и VB6 ... и хотя string.Empty может работать только в .Net, "" (или '') работает везде. Мне нравится использовать "" просто для единообразия на разных языках в одном продукте.

TomXP411 18.07.2014 00:30

В Visual Studio 2015 update 3 функция «Быстрые действия» редактора C# предлагает всегда «упрощать» String.Empty повсюду. когда я принимаю предложение, он преобразуется в string.Empty. Было бы интересно узнать причину этого.

Cee McSharpface 09.08.2016 22:16
(и я не работал ни с одним из разработчиков, которые это делают) ну, я не понимаю, как люди могут использовать другие шрифты, кроме Verdana для исходного кода; -]
t3chb0t 30.01.2017 16:20

У меня была проблема с пиаром, просившая меня заменить "" на string.Empty. Наверное, самый педантичный PR-выпуск.

xleon 02.10.2020 00:01

Хотя разница очень-ОЧЕНЬ небольшая, разница все же есть.

1) "" создает объект, а String.Empty - нет. Но этот объект будет создан один раз и на него будет ссылаться из пула строк позже, если у вас есть еще один "" в коде.

2) Строка и строка одинаковы, но я бы рекомендовал использовать String.Empty (а также String.Format, String.Copy и т. д.), Поскольку точечная нотация указывает на класс, а не на оператор, и наличие класса, начинающегося с заглавной буквы, соответствует Стандарты кодирования C#.

string.Empty является "", проверьте источник

dss539 12.11.2009 23:17

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

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

Это общедоступное строковое поле, доступное только для чтения, и его значения: "" ... зачем это менять?

Matthew Whited 30.09.2009 00:23

Вы упускаете то, о чем говорит @Jason. Как узнать, что вы впервые видите string.Empty? Знаете ли вы, что такое "", когда вы его впервые увидели?

David R Tribble 21.05.2012 23:45

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

Глядя на закулисный код, вы действительно не видите никакой разницы. Единственное отличие заключается в 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 

@PrateekSaluja: чтобы увидеть IL, вы можете использовать ildasm.exe, который поставляется с Visual Studio. Чтобы увидеть разборку, используйте окно «Разборка» в меню отладки при достижении точки останова (работает и в коде выпуска).

Thomas Bratt 08.01.2012 22:23

Ненавижу, что я собираюсь рекомендовать этот продукт .. НО .. отражатель позволяет вам выбрать язык при разборке исходного кода, а IL - это вариант! ILDASM просто устарел ... Кажется, что команда MS tools не оттачивает или не выпускает хорошие инструменты!

felickz 19.01.2012 19:00

Это полностью предпочтение стиля кода, то есть того, как .NET обрабатывает строки. Впрочем, вот мои мнения :)

Я всегда использую имена типов BCL при доступе к статическим методам, свойствам и полям: String.Empty или Int32.TryParse(...) или Double.Epsilon

Я всегда использую ключевые слова C# при объявлении новых экземпляров: int i = 0; или string foo = "bar";

Я редко использую необъявленные строковые литералы, поскольку мне нравится иметь возможность сканировать код, чтобы объединить их в многоразовые именованные константы. В любом случае компилятор заменяет константы литералами, так что это скорее способ избежать магических строк / чисел и придать им немного больше смысла с помощью имени. К тому же изменить значения проще.

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

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

Заявление switch - очень хороший пример. Кроме того, если вы сделаете необязательный параметр, например void MyMethod(string optional = "") { ... }, также невозможно будет использовать string.Empty. И затем, конечно, если вы хотите определить поле const или локальную переменную, const string myString = "";, снова "" - единственный вариант. Если бы только string.Empty был постоянным полем, не было бы разницы. Но это не так, поэтому в некоторых случаях вам придется использовать "". Так почему бы не использовать "" постоянно?

Jeppe Stig Nielsen 30.10.2012 01:19

Это действительно сильный аргумент, потому что использование string.Empty не позволяет вам достичь последовательность в вашей кодовой базе: вы должны использовать две разные сущности, чтобы выразить одно и то же. И чтобы добавить к списку вещей, которые вы не можете делать: вы не можете использовать string.Empty с атрибуты.

Pragmateek 08.11.2013 02:03

Очень хорошие моменты! Ссылка не работает. Вот копия содержания: web.archive.org/web/20131230161806/http://kossovsky.net/…

ygoe 13.02.2015 18:37

На http://blogs.msdn.com/b/brada/archive/2003/04/22/49997.aspx:

As David implies, there difference between String.Empty and "" are pretty small, but there is a difference. "" actually creates an object, it will likely be pulled out of the string intern pool, but still... while String.Empty creates no object... so if you are really looking for ultimately in memory efficiency, I suggest String.Empty. However, you should keep in mind the difference is so trival you will like never see it in your code...
As for System.String.Empty or string.Empty or String.Empty... my care level is low ;-)

Это сообщение в блоге MSDN было в 2003 году .... вы уверены, что это все еще верно для последних версий .NET ?!

Carsten Schütte 29.04.2013 00:45

@ CarstenSchütte: Мне кажется, что эта функция не предназначена для значительных изменений ... и если это так, то в Интернете было много шума по этому поводу.

sergiol 29.04.2013 16:03

@sergiol Если поле более эффективно, чем литерал, то это однозначно ошибка производительности. Так что есть надежда, что к настоящему времени это будет исправлено.

Konrad Rudolph 26.01.2016 14:41

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

String.Empty не является константой: см. stackoverflow.com/questions/507923/… Это фактически экземпляр класса String по дизайну. О раскраске упоминалось ранее, хотя и немного скрыто: stackoverflow.com/questions/263191/…

Michael 30.10.2019 10:26

Я бы предпочел string.EmptyString.Empty, потому что вы можете использовать его без необходимости включать using System; в свой файл.

Что касается выбора "" вместо string.Empty, это личное предпочтение, которое должно решаться вашей командой.

Я единственный член команды, как мне решить? бросить кости?

Gqqnbig 21.06.2017 01:37

Для тех, кому может быть интересно, как можно использовать константу string.Empty без импорта пространства имен using System - ключевые слова в C# просто преобразуются в свое полное имя, которое также включает пространство имен, прежде чем они будут записаны как MSIL в выходных * .dll или * .exe файл. Таким образом, string.Empty записывается компилятором как System.String.Empty в MSIL. И, как вы уже могли знать, если вы упомянули полностью определенное имя типа, вы можете пропустить импорт пространств имен в верхней части файла кода.

RBT 26.08.2017 06:13

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

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

В случае инициализации с помощью string.Empty появляется предупреждение компилятора.

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

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

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

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

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

Palec 30.04.2016 11:46

Интересно. Обратите внимание, что объявление var unused = "literal"; может быть полностью оптимизировано (удалено) компилятором. Не может иметь побочных эффектов. С другой стороны, var unused = MyClass.Member; нельзя удалить полностью. Это потому, что чтение Member может иметь побочные эффекты. Если Member является статическим свойством с аксессором get, очевидно, что вызов геттера должен быть сохранен. Но даже если Member является статическим полем, может возникнуть побочный эффект, связанный с запуском статического конструктора. Конечно, было бы плохой стиль кодирования, если бы это было так. Но для чтения Member нужен манекен.

Jeppe Stig Nielsen 31.01.2017 01:03

Я выполнил этот очень простой тест, используя следующий метод в консольном приложении:

private static void CompareStringConstants()
{
    string str1 = "";
    string str2 = string.Empty;
    string str3 = String.Empty;
    Console.WriteLine(object.ReferenceEquals(str1, str2)); //prints True
    Console.WriteLine(object.ReferenceEquals(str2, str3)); //prints True
}

Это явно предполагает, что все три переменные, а именно str1, str2 и str3, хотя инициализируются с использованием разного синтаксиса, указывают на один и тот же строковый (нулевой длины) объект в памяти. Я выполнил этот тест в консольном приложении .NET 4.5. Так что внутренне у них нет никакой разницы, и все сводится к удобству того, какой из них вы хотите использовать в качестве программиста. Такое поведение строкового класса известно в .NET как интернирование струн. У Эрика Липперта есть очень хороший блог здесь, описывающий эту концепцию.

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

Рассмотрим следующий код C# ...

(customer == null) ? "" : customer.Name

против

(customer == null) ? string.empty : customer.Name

Я лично считаю, что последнее менее двусмысленно и легче читается.

Как отмечали другие, фактические различия незначительны.

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

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

Если вы наберете string.EMpty или Strng.Empty, компилятор сообщит вам, что вы сделали это неправильно. Немедленно. Он просто не компилируется. Как разработчик вы ссылаетесь на намерение специфический, что компилятор (или другой разработчик) не может каким-либо образом неверно истолковать, и когда вы делаете это неправильно, вы не можете создать ошибку.

Если вы наберете "", когда имеете в виду "", или наоборот, компилятор с радостью сделает то, что вы ему сказали. Другой разработчик может или не сможет понять ваше конкретное намерение. Ошибка создана.

Задолго до string.Empty я использовал стандартную библиотеку, которая определяла константу EMPTY_STRING. Мы по-прежнему используем эту константу в операторах case, где string.Empty не допускается.

По возможности заставляйте компилятор работать на вас и исключите возможность человеческой ошибки, какой бы незначительной она ни была. ИМО, это превосходит «читабельность», как указывали другие.

Специфика и соблюдение времени компиляции. Это то, что на ужин.

Я использую "", потому что в моем коде он будет ярко-желтым ... по какой-то причине String.Empty полностью белый в моей теме Visual Studio Code. И я считаю, что это для меня самое главное.

Пустая строка похожа на пустой набор, просто имя, которое все используют для вызова "". Также в формальных языках строки, созданные из алфавита и имеющие нулевую длину, называются пустой строкой. И для набора, и для строки есть специальный символ. Пустая строка: ε и пустой набор: ∅. Если вы хотите поговорить об этой строке нулевой длины, вы назовете ее пустой строкой, чтобы все точно знали, о чем вы говорите. Теперь, если вы назовете это пустой строкой, почему бы не использовать string.Empty в коде, это показывает, что намерение явно выражено. Обратной стороной является то, что он не является константой и поэтому доступен не везде, как в атрибутах. (Это не постоянная величина по некоторым техническим причинам, см. Справочный источник.)

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

Они используют "" в автоматически сгенерированных файлах, таких как файл сборки, так что я этим и занимаюсь. Фактически, когда я пытаюсь заменить любой ниже "" на String.Empty, у меня происходит сбой Visual Studio. Вероятно, этому есть логическое объяснение, но с моими ограниченными знаниями, если я просто буду делать то, что делают они, большую часть времени все получается. (Contra: я знаю, что в некоторых автоматически сгенерированных файлах также используется String.Empty, что меня опровергает. :))

<Assembly: System.Reflection.AssemblyCulture("")>
<Assembly: System.Reflection.AssemblyDescription("")>
<Assembly: System.Reflection.AssemblyFileVersion("1.0.0.0")>
<Assembly: System.Reflection.AssemblyKeyFile("")>
<Assembly: System.Reflection.AssemblyProduct("")>
<Assembly: System.Reflection.AssemblyTitle("")>

Другие вопросы по теме