Инициализация строки по умолчанию: NULL или пустой? [закрытый]
Я всегда инициализировал свои строки в NULL, думая, что NULL означает отсутствие значения и "" или строки.Пустое-допустимое значение. В последнее время я видел больше примеров кода, где строка.Пустой считается значением по умолчанию или не представляет значения. Это кажется мне странным, с недавно добавленными типами nullable в c# кажется, что мы делаем шаги назад со строками, не используя NULL для представления "без значения".
что вы используете в качестве инициализатор по умолчанию и почему?
Edit: основываясь на ответах, я продолжаю свои дальнейшие мысли
избегая обработки ошибок если значение не должно быть null, почему он получил значение
NULLв первую очередь? Возможно, было бы лучше определить ошибку в том месте, где она возникает, а не покрывать ее через остальную часть вашей кодовой базы?избегая null проверки если вы устали от выполнения нулевых проверок в коде, не лучше ли абстрагировать нулевые проверки? Возможно, обернуть (или удлинить!) строковые методы, чтобы сделать их
NULLбезопасная? Что произойдет, если вы постоянно используетеString.Emptyи null случается работать это путь в вашу систему, вы начинаете добавлятьNULLпроверяет в любом случае?
Я не могу не вернуться к мнению, что это лень. Любой DBA ударил бы вас девять способов глупо, если бы вы использовали " вместо null в егоее базе. Я думаю, что те же принципы применяются в программировании, и должен быть кто-то, чтобы ударить тех, кто использует String.Empty, а не NULL представлять никакой ценности.
Вопросы
- в C#, я должен использовать string.Пусто или строка.Пусто или "" ?
- в чем разница между строкой.Пусто и ""
- Null или пустая строка для представления данных в столбце таблицы?
17 ответов:
+1 для различения "пустой" и нулевой. Я согласен, что" пустой "должно означать" действительный, но пустой "и" нулевой "должен означать" недействительный."
поэтому я бы ответил на ваш вопрос так:
пустой когда мне нужно действительное значение по умолчанию, которое может или не может быть изменено, например, второе имя пользователя.
NULL когда это ошибка, если следующий код не устанавливает значение явно.
по данным MSDN:
инициализация строк
Emptyвместоnull, вы можете уменьшить шансыNullReferenceExceptionпроисходит.всегда использовать
IsNullOrEmpty()это хорошая практика, тем не менее.
почему вы хотите, чтобы ваши строки инициализации вообще? Вам не нужно инициализировать переменную, когда вы ее объявляете, и IMO, вы должны делать это только тогда, когда значение, которое вы назначаете, допустимо в контексте блока кода.
Я вижу это много:
string name = null; // or String.Empty if (condition) { name = "foo"; } else { name = "bar"; } return name;не инициализация в null было бы так же эффективно. Кроме того, чаще всего вы хотите присвоить значение. Инициализируя значение null, вы можете пропустить пути кода, которые не присваивают значение. Как Итак:
string name = null; // or String.Empty if (condition) { name = "foo"; } else if (othercondition) { name = "bar"; } return name; //returns null when condition and othercondition are falseЕсли вы не инициализируете значение null, компилятор выдаст ошибку, сообщающую, что не все пути кода присваивают значение. Конечно, это очень простой пример...
Matthijs
для большинства программ, которые на самом деле не являются программным обеспечением для обработки строк, логика программы не должна зависеть от содержимого строковых переменных. Всякий раз, когда я вижу что-то подобное в программе:
if (s == "value")у меня плохое предчувствие. Почему в этом методе есть строковый литерал? Что такое настройка
s? Знает ли он, что логика зависит от значения строки? Знает ли он, что он должен быть строчным, чтобы работать? Я должен исправить это, изменив его на использованиеString.Compare? Должен Я создаюEnumи разбор в нем?С этой точки зрения можно перейти к философии кода, которая довольно проста: вы избегаете изучения содержимого строки, где это возможно. Сравнение строки с
String.Emptyна самом деле это просто частный случай сравнения его с литералом: это то, чего следует избегать, если вам действительно не нужно.зная это, я не моргаю, когда вижу что-то вроде этого в коде:
string msg = Validate(item); if (msg != null) { DisplayErrorMessage(msg); return; }Я знаю, что
Validateникогда больше не вернетсяString.Empty, потому что мы пишем лучший код, чем это.конечно, остальной мир так не работает. Когда ваша программа имеет дело с пользовательским вводом, базами данных, файлами и т. д., Вы должны учитывать другие философии. Там, это работа вашего кода, чтобы наложить порядок на хаос. Часть этого порядка знает, когда пустая строка должна означать
String.Emptyи когда это должно означатьnull.(просто чтобы убедиться, что я не говорил из моей задницы, я просто искал нашу кодовую базу для ' String.IsNullOrEmpty'. Все 54 его вхождения находятся в методах, которые обрабатывают пользовательский ввод, возвращают значения из скриптов Python, проверяют значения, полученные из внешних API, и т. д.)
Это зависит.
вы должны быть в состоянии сказать, если значение отсутствует (возможно ли, чтобы он не был определен)?
пустая строка является допустимым значением для использования этой строки?
Если вы ответили "да" на оба вопроса, Вы хотите использовать null. В противном случае вы не можете сказать разницу между "нет значения" и "пустая строка".
Если вам не нужно знать, если нет значения, то пустая строка, вероятно, безопаснее, так как это позволяет вам чтобы пропустить нулевые проверки везде, где вы его используете.
Это на самом деле зияющая дыра в языке C#. Невозможно определить строку, которая не может быть null. Это приводит к проблемам, столь же простым, как и тот, который вы описываете, что заставляет программистов принимать решение, которое им не нужно делать, поскольку во многих случаях NULL и String.Пустые означают то же самое. Это, в свою очередь, может позже заставить других программистов обрабатывать как NULL, так и String.Пусто, что раздражает.
большая проблема заключается в том, что базы данных позволяют определите поля, которые сопоставляются со строкой C#, но поля базы данных могут быть определены как NOT NULL. Таким образом, нет способа точно представить, скажем, поле varchar( 100 ) NOT NULL в SQL Server с использованием типа C#.
другие языки, такие как Spec#, позволяют это.
на мой взгляд, неспособность C#определить строку, которая не позволяет null, так же плоха, как и ее предыдущая неспособность определить int, который позволяет null.
чтобы полностью ответить на ваш вопрос: я всегда используйте пустую строку для инициализации по умолчанию, потому что это больше похоже на то, как работают типы данных базы данных. (Edit: это утверждение было очень неясным. Он должен читать "я использую пустую строку для инициализации по умолчанию, когда NULL является избыточным состоянием, точно так же, как я настраиваю столбец базы данных как NOT NULL, если NULL будет избыточным состоянием. Точно так же многие из моих столбцов БД настроены как NOT NULL, поэтому, когда я привожу их в строку C#, строка будет пустой или иметь значение, но никогда не будет НОЛЬ. Другими словами, Я инициализирую строку только в NULL, если null имеет значение, отличное от значения String.Пустой, и я считаю, что этот случай менее распространен (но люди здесь привели законные примеры этого случая).")
похоже, что это частный случай http://en.wikipedia.org/wiki/Null_Object_pattern
Я либо установить его в "" или null-я всегда проверяю с помощью строки.IsNullOrEmpty, так что либо хорошо.
но внутренний выродок во мне говорит, что я должен установить его в null, прежде чем у меня будет правильное значение для него...
возможно ли, что это метод предотвращения ошибок (желательно или нет..)? Поскольку "" все еще является строкой, вы могли бы вызвать строковые функции на ней, что привело бы к исключению, если бы оно было NULL?
Я всегда инициализирую их как
NULL.Я всегда использовать
string.IsNullOrEmpty(someString)чтобы проверить его значение.простой.
Это зависит от ситуации. В большинстве случаев я использую строку.Пусто потому что я не хочу делать проверки каждый раз, когда я пытаюсь использовать строку. Это делает код намного проще, и вы с меньшей вероятностью введете нежелательные сбои NullReferenceException.
Я только устанавливаю строку в null, когда мне нужно знать, была ли она установлена или нет, и где пустая строка является чем-то допустимым для ее установки. На практике я нахожу такие ситуации редкими.
пустая строка-это значение (фрагмент текста, который, кстати, не содержит никаких букв). Null означает отсутствие значения.
Я инициализирую переменные в null, когда хочу указать, что они не указывают или не содержат фактических значений - когда намерение не имеет значения.
повторяя ответ Tomalak, имейте в виду, что когда вы присваиваете строковой переменной начальное значение null, ваша переменная больше не является строковым объектом; то же самое с любым объектом в C#. Таким образом, если вы попытаетесь получить доступ к любым методам или свойствам для своей переменной, и вы предполагаете, что это строковый объект, вы получите исключение NullReferenceException.
Null следует использовать только в тех случаях, когда значение является необязательным. Если значение не является необязательным (например, " имя " или "адрес"), то значение никогда не должно быть null. Это относится к базам данных, а также к POCOs и пользовательскому интерфейсу. Null означает " это значение является необязательным и в настоящее время отсутствует."
Если поле не является обязательным, то вы должны инициализировать его как пустую строку. Чтобы инициализировать его как null, ваш объект будет помещен в недопустимое состояние (недопустимое по вашим собственным данным модель.)
лично я бы предпочел, чтобы строки не были nullable по умолчанию, но вместо этого только nullable если мы объявим "string?". Хотя, возможно, это неосуществимо или логично на более глубоком уровне; не уверен.
Я думаю, что нет причин не использовать null для неназначенного (или в этом месте в потоке программы не происходит) значения. Если вы хотите отличить, есть ==null. Если вы просто хотите проверить определенное значение и не волнует, является ли это null или что-то другое, String.Equals ("XXX", MyStringVar) делает просто отлично.
Comments