Я читаю « Эффективный C # » Билла Вагнера. В элементе 14 - Минимизация логики повторяющейся инициализации он показывает следующий пример использования новых дополнительных параметров в конструкторе:
public MyClass(int initialCount = 0, string name = "")
Обратите внимание, что он использовал ""
вместо string.Empty
.
Он комментирует:
Вы заметите [в примере выше], что второй конструктор указал "" для значения по умолчанию в параметре name , а не более привычного
string.Empty
. Это потому, чтоstring.Empty
это не константа времени компиляции. Это статическое свойство, определенное в строковом классе. Поскольку это не константа компиляции, вы не можете использовать ее в качестве значения по умолчанию для параметра.
Если мы не можем использовать string.Empty
статику во всех ситуациях, разве это не противоречит ее назначению? Я подумал, что мы будем использовать его, чтобы быть уверенными в том, что у нас есть независимые от системы средства обращения к пустой строке. Я неправильно понимаю? Спасибо.
ОБНОВЛЕНИЕ
Просто следующий комментарий. Согласно MSDN:
Каждый необязательный параметр имеет значение по умолчанию как часть его определения. Если для этого параметра не передается аргумент, используется значение по умолчанию. Значения по умолчанию должны быть постоянными.
Тогда мы не сможем System.Environment.NewLine
ни использовать , ни использовать вновь созданные объекты в качестве значений по умолчанию. Я еще не использовал VS2010, и это разочаровывает!
источник
Ответы:
Что касается компилятора C # 2.0, в
String.Empty
любом случае здесь очень мало смысла , и на самом деле во многих случаях это пессимизация, поскольку компилятор может встроить некоторые ссылки,""
но не может сделать то же самое сString.Empty
.В C # 1.1 было полезно избегать создания множества независимых объектов, содержащих пустую строку, но те времена прошли.
""
работает нормально.источник
Ничто не мешает вам определить вашу собственную константу для пустой строки, если вы действительно хотите использовать ее в качестве значения необязательного параметра:
const string String_Empty = ""; public static void PrintString(string s = String_Empty) { Console.WriteLine(s); }
[Как в сторону, одна из причин предпочитать
String.Empty
более чем""
в целом, что не было упомянуто в других ответов, является то , что существуют различные символы Unicode (нулевой ширины столяры, и т.д.), которые эффективно невидимые невооруженным глазом. То есть то, что выглядит как""
пустая строка, не обязательно является пустой строкой, тогда какString.Empty
вы точно знаете, что используете. Я понимаю, что это не общий источник ошибок, но это возможно.]источник
Из исходного вопроса:
Каким образом пустая строка может отличаться от системы к системе? Это всегда строка без символов! Мне было бы очень страшно, если бы я когда-нибудь нашел реализацию, в которой
string.Empty == ""
возвращается false :) Это не то же самое, что что-то вродеEnvironment.NewLine
.Из сообщения о награде Counter Terrorist:
Что ж, этого точно не произойдет.
Хотя мне лично тоже понравился бы совсем другой механизм по умолчанию, необязательные параметры работают в .NET с самого начала - и это всегда означает встраивание константы в метаданные, чтобы вызывающий код мог скопировать эту константу в вызов site, если не указан соответствующий аргумент.
С
string.Empty
это действительно бессмысленно - использование""
будет делать то , что вы хотите; это что больно использовать строковый литерал? (Я везде использую литерал - я никогда не используюstring.Empty
- но это другой аргумент.)Вот что меня удивляет в этом вопросе - жалоба вращается вокруг чего-то, что на самом деле не вызывает реальной проблемы. Это более важно в тех случаях, когда вы хотите, чтобы значение по умолчанию вычислялось во время выполнения, потому что оно может действительно отличаться. Например, я мог бы представить себе случаи, когда вы хотите иметь возможность вызывать метод с
DateTime
параметром и по умолчанию использовать «текущее время». На данный момент я знаю только один нечетко элегантный обходной путь:public void RecordTime(string message, DateTime? dateTime = null) { var realDateTime = dateTime ?? DateTime.UtcNow; }
... но это не всегда уместно.
В заключении:
string.Empty
любом случае это бессмысленноисточник
Environment.Newline
.. Единственное, чего не хватает в вашем примере, - это проверка переменной на значение NULL и возврат исключения разработчику, сообщающий ему, что, хотя оно допускает значение NULL, оно не принял.if(dateTime == null){ throw new ArgumentException("The dateTime parameter must be set. Nullable type used for device independent variable set.");}
или что-то типа того. Но мне это очень нравится! Есть ли другие предостережения, чтобы делать это по-своему?Я никогда не использую string.Empty, я не вижу в этом смысла. Может быть, это облегчит людям, которые действительно плохо знакомы с программированием, но я сомневаюсь, что это полезно даже для этого.
источник
""
и" "
, но я не могу сказать, что" "
это все, что обычно.Я думаю, что идея string.Empty в том, что она улучшает читаемость. Это не похоже на новую строку, где есть разница между тем, как она представлена на разных платформах. Жаль, что это нельзя использовать в параметре по умолчанию. Однако при переносе между Windows и чем-то вроде Mono в Linux это не вызовет никаких проблем.
источник
String.Empty
более читабельным. . . Хотя лично я считаю это немного сумасшедшим.""
вероятно, самая распространенная строка из существующих, и все видели ее миллиард раз, так почему же она нечитаема?String.Empty
примерно так же полезен, как если бы существовалInt32.Zero
.К вашему сведению, похоже, что такое же ограничение накладывается на значения, передаваемые конструкторам атрибутов - они должны быть постоянными. Поскольку string.empty определяется как:
public static readonly string Empty
вместо фактической константы его нельзя использовать.
источник
Использую
string.Empty
чисто для читабельности.Если кому-то еще понадобится прочитать / изменить мой код позже, они узнают, что я хотел проверить или установить что-то в пустую строку. Использование just
""
может иногда вызывать ошибки и путаницу, потому что я, возможно, просто забыл вставить туда нужную строку.Например:
if(someString == string.Empty) { }
против
if(someString == "") { }
Первое
if
утверждение мне кажется намного более осознанным и понятным. Поскольку это всего лишь предпочтение, я действительно не вижу смысла в том, чтобы использовать""
вместоstring.Empty
.источник
Возможно, лучшим решением этой проблемы является перегрузка этого метода следующим образом:
public static void PrintString() { PrintString(string.Empty); }
источник