Какова цель пустой строки? - PullRequest
10 голосов
/ 30 марта 2010

Для меня, как для разработчика, так и для пользователя, я нахожу пустую строку ("") бесполезной и вызывает много путаницы, это все равно что сказать string == char []

Возможно, компьютерам нужна пустая строка, поэтому я хотел бы узнать, почему.

Смотри также:

Ответы [ 8 ]

31 голосов
/ 30 марта 2010

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

  • Нуль означает, что значение не определено или неизвестно.

  • Пустая строка означает, что известно, что она ничто (пусто).

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

var source = "Hello";
var result = source.Remove("Hello");  // result is now: ""

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

Интересно, что некоторые базы данных НЕ различают NULL и пустую строку - лучшим примером является Oracle. В Oracle:

INSERT into MYTABLE(name) VALUES('')

фактически вставляет NULL в таблицу. На самом деле это может создать запутанные ситуации при написании кода, который манипулирует данными из базы данных в .NET - иногда вы получаете DBNull.Value, где вы ожидали String.

11 голосов
/ 30 марта 2010

Зачем нам ноль? Это действительно тот же вопрос. Что такое "пижама" без всех а? "PJM". Что такое "а" без всех а? "". Просто как тот. Продуктом некоторых строковых операций является строка без каких-либо символов, и это пустая строка. Он ведет себя так же, как любая другая строка - вы можете легко определить ее длину; вы можете объединить его с другими строками, можете сосчитать в нем и т. д.

9 голосов
/ 30 марта 2010

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

И просто для записи в C # рекомендуется указывать string.Empty вместо жесткого кодирования в "".

Редактировать: И, как указал Л.Бушкин, есть разница между тем, у кого есть пустое значение, и тем, у которого есть неизвестное значение.

6 голосов
/ 30 марта 2010

Можно утверждать, что пустая строка является экземпляром Null Object Pattern . Как указал Энтони, это используется, чтобы избежать особых случаев и большого количества if s.

2 голосов
/ 30 марта 2010

Служит для тех же целей, что и число «ноль» для целых чисел.Если у вас не было нуля, вы не могли бы записать количество овец, которых у вас есть, когда у вас нет овец.Аналогично, если у вас нет пустой строки, вы не можете записать последовательность символов, которые у вас есть, когда у вас нет символов.

Применяются все виды аналогичных алгебраических законов: как X+0 - это то же самое, что и X, Y cat "" - это то же самое, что и Y и т. Д.

Давайте поговорим о подстроках.Если у меня есть строка «abc», то

substring("abc",1,3)  is  "abc"
substring("abc",1,2)  is  "ab"
substring("abc",1,1)  is  "a"
substring("abc",1,0)  is ...?

Еще один интересный случай:

substring("abc",1,3) is "abc"
substring("abc",2,2) is "bc"
substring("abc",3,1) is "c"
substring("abc",4,0) is ...?

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

1 голос
/ 30 марта 2010

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

Что-то просто интереснее, когда его нет

Нечто не может быть выражено, если мы не можем выразить значение ничего (что сильно отличается от «неизвестного значения», равного нулю

1007 * например *

string allUpperCaseLetters = "";
for(byte i = 'A';i<'Z';i++)
{
  allUpperCaseLetters += (char)i;
}

если вы скажете unknow plus (char) i, результат все равно будет неизвестен, однако "+" A "- это" A ". Насколько большой 1 + неизвестно? когда дополнение может обернуться, вы даже не можете утверждать, что 1 + A больше, чем A (если A неизвестно)

некоторые операции были бы очень странными, если бы у нас не было "" как насчет

string letters = allUpperCaseLetters;
for(;i>0;)
{
  int i = letters.Length
  Console.WriteLine(letters[0]);
  letters = letters.Substring(1);
}

почему вы хотите, чтобы первая строка внутри цикла выдавала исключение NullReferenceException, а не просто цикл, заканчивающийся, когда больше нет букв?

0 голосов
/ 29 апреля 2010

Я не слышал жаловаться на это раньше. null - это специальное значение, которое может быть значением любого объекта, а пустая строка - String. Аналогичная аналогия также может быть проведена между null и пустым List или массивом.

0 голосов
/ 30 марта 2010

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

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

...