hemantwithu Ответов: 7

Разница между строками.Пусто и ""?


Всем привет!В чем разница между строкой и строкой?Пусто и ""?
например ,

string s1=String.Empty;
string s2="";

7 Ответов

Рейтинг:
56

AspDotNetDev

Размещение магических значений в коде обычно не одобряется по целому ряду причин (некоторые из которых уже были объяснены). Хоть струна.Пустой кажется немного другим зверем (например, потому что у вас на самом деле нет возможности изменять константу, что является одной из причин использования констант).

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

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


Sergey Alexandrovich Kryukov

Это мудро.

Обычно я не допускаю никаких непосредственных строковых констант в коде и ограничиваю любые определения констант очень немногими специальными файлами и статическими классами.

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

Abhinav S

Хороший ответ.

Рейтинг:
48

Toli Cuturicu

Добавление к чему ashokbusybee corectly сказал, что есть случаи, когда вы должны использовать "", например:

[DefaultValue("")]
public string MyStringProperty
{
    // Accessors
}

Попытайтесь поставить string.Empty вот так!


hemantwithu

Спасибо.

Sergey Alexandrovich Kryukov

Толи, надо было добавить: это потому что струна.Пустое-это статическое поле только для чтения, где принимается только константа.

Sergey Alexandrovich Kryukov

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

Рейтинг:
39

ashokbusybee

string.empty обрабатывает память эффективнее, чем string x="";
""на самом деле создает объект, но string.empty этого не делает.

Кроме того, это лучшая практика, чтобы избежать жесткого кодирования, как "";


hemantwithu

Спасибо

hemantwithu

Причина моего голосования 5
Автоматическое голосование 5 за принятие ответа.

Sergey Alexandrovich Kryukov

Я абсолютно согласен с вашей заметкой о жестком кодировании "", но не с эффективностью: попробуйте вызвать объект.ReferenceEquals для сравнения этих двух-он вернет "true". Я не уверен, что это гарантировано.

Почти во всех случаях-струна.Пустой - это очень предпочтительно.

Рейтинг:
2

anupkulkarni85

пожалуйста, смотрите следующую ссылку

http://msdn.microsoft.com/en-us/library/system.string.empty%28v=VS.80%29.aspx


Рейтинг:
0

Sergey Alexandrovich Kryukov

Самое фундаментальное отличие отсутствует во всех предыдущих ответах.

Посмотрите на декларацию о string.Empty;

public static readonly string Empty;


Так что, строго говоря, это не константа. Это поле только для чтения, фактически назначенное константе.
В Примере, который вы предоставляете со своим вопросом, "" - Это непосредственная константа (создаваемая каждый раз, когда вы помещаете ее в код).
Я сравнил их для референциальной эквивалентности, используя object.ReferenceEquals -- они выглядели одинаково, но ничего не гарантировало этого.

Разница между полем константы и полем только для чтения иногда может быть обнаружена во время выполнения. В частности, это причина, по которой строка.Пустой не допускается в конструкторе атрибутов, где атрибут разрешен-к сожалению! (см. ответ толи Разница между строками.Пусто и ""?[^]).

Почти во всех остальных случаях используется строка.Пустота разрешена и очень предпочтительна.

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

Один совет для не использующий "" для сравнения: испытание статических предикатов string.IsNullOrEmpty(string).

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


Espen Harlinn

Хорошее усилие, мой 5-й

Sergey Alexandrovich Kryukov

Спасибо, Эспен.
Интересно, что в какой-то теме, связанной со статьей, мне пришлось доказывать, что "" работает правильно (кто-то пытался утверждать, что он будет создавать все больше и больше уникальных объектов каждый раз, по объекту.ReferencesEqual действительно может это проверить). Тем не менее, я категорически против"", так как это на самом деле все еще нежелательная непосредственная константа, как и любая другая.
--СА

Рейтинг:
0

Abhinav S

Видеть это обсуждение[^] или
этот[^].


Рейтинг:
0

pankajupadhyay29

Разница между строками.Пусто и "" очень мало. String.empty не создаст никакого объекта, в то время как "" создаст новый объект в памяти для проверки. Следовательно, string.empty лучше подходит для управления памятью.