Строковая инициализация по умолчанию: ПУСТОЙ или Пустой? [закрытый]

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

127
задан Community 23 May 2017 в 11:54
поделиться

14 ответов

+1 для различения "пустого" и ПУСТОГО. Я соглашаюсь, что "пустой" должен означать "допустимый, но пробел" и "ПУСТОЙ УКАЗАТЕЛЬ" должны означать "недопустимый".

, Таким образом, я ответил бы на Ваш вопрос как это:

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

ПУСТОЙ УКАЗАТЕЛЬ , когда это - ошибка, если следующий код не устанавливает значение явно.

110
ответ дан 24 November 2019 в 00:47
поделиться

Строки не являются типами значения и никогда не будут ;-)

0
ответ дан 24 November 2019 в 00:47
поделиться

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

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

1
ответ дан 24 November 2019 в 00:47
поделиться

Это зависит от ситуации. В большинстве случаев я использую Строку. Пустой, потому что я не хочу делать пустой указатель, проверяет каждый раз, когда я пытаюсь использовать строку. Это делает код намного более простым, и Вы, менее вероятно, представите нежелательные катастрофические отказы NullReferenceException.

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

1
ответ дан 24 November 2019 в 00:47
поделиться

Я всегда инициализирую их как NULL .

я всегда использование string.IsNullOrEmpty(someString) для проверки это - значение.

Простой.

2
ответ дан 24 November 2019 в 00:47
поделиться

Действительно ли возможно, что это - ошибочный метод предотвращения (желательный или нет..)? С тех пор "" все еще строка, Вы смогли бы назвать строковые функции на ней, которые привели бы к исключению, если бы это было ПУСТЫМ?

2
ответ дан 24 November 2019 в 00:47
поделиться

Я всегда объявляю строку с string.empty;

3
ответ дан 24 November 2019 в 00:47
поделиться

Я или набор это к "" или пустой указатель - я всегда проверяю при помощи Строки. IsNullOrEmpty, таким образом, любой в порядке.

, Но внутренний фанат во мне говорит, что я должен установить его в NULL, прежде чем у меня будет собственное значение для него...

3
ответ дан 24 November 2019 в 00:47
поделиться

кажется, что это - особый случай http://en.wikipedia.org/wiki/Null_Object_pattern

4
ответ дан 24 November 2019 в 00:47
поделиться

Это зависит.

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

пустая строка допустимое значение для использования той строки?

, Если Вы ответили на "да" обоим, затем Вы захотите использовать пустой указатель. Иначе Вы не можете сказать различие между "никаким значением" и "пустой строкой".

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

5
ответ дан 24 November 2019 в 00:47
поделиться

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

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.

(Только для проверки я не говорил из задницы, я просто искал нашу кодовую базу 'Строку. IsNullOrEmpty'. Все 54 случаев его находятся в методах, которые обрабатывают ввод данных пользователем, возвращаемые значения из сценариев Python, исследуют значения, полученные от внешних API, и т.д.)

8
ответ дан 24 November 2019 в 00:47
поделиться

Согласно MSDN:

Путем инициализации строк с эти Empty значение вместо null, можно уменьшить возможности NullReferenceException появление.

Всегда использование IsNullOrEmpty() является хорошей практикой, тем не менее.

31
ответ дан 24 November 2019 в 00:47
поделиться

Это - на самом деле зияющая дыра на языке C#. Нет никакого способа определить строку, которая не может быть пустой. Это вызывает проблемы, столь же простые как та, которую Вы описываете, который вынуждает программистов принять решение, им не придется сделать, с тех пор во многих случаях ПУСТОЙ УКАЗАТЕЛЬ и Строка. Пустой средний то же самое. Это, в свою очередь, может позже вынудить других программистов должными быть обработать и ПУСТОЙ УКАЗАТЕЛЬ и Строку. Пустой, который является раздражающим.

А большая проблема состоит в том, что базы данных позволяют Вам определять поля, которые отображаются на строку C#, но поля базы данных могут быть определены как NOT NULL. Так, нет никакого способа точно представить, скажем, varchar (100) поле NOT NULL в SQL Server с помощью типа C#.

Другие языки, такие как Спецификация #, действительно позволяют это.

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

Для завершенного ответа на вопрос: Я всегда использую пустую строку для инициализации по умолчанию, потому что это более подобно тому, как работают типы данных базы данных. (Редактирование: Этот оператор был очень неясен. Это должно читать, "Я использую пустую строку для инициализации по умолчанию, когда ПУСТОЙ УКАЗАТЕЛЬ является лишним состоянием, очень таким же образом я настроил столбец базы данных как NOT NULL, если ПУСТОЙ УКАЗАТЕЛЬ будет лишним состоянием. Точно так же многие мои столбцы DB настраиваются как NOT NULL, поэтому когда я приношу тем, которые в строку C#, строка будет пустой или иметь значение, но никогда не будет ПУСТОЙ. Другими словами, я только инициализирую строку к ПУСТОМУ УКАЗАТЕЛЮ, если пустой указатель имеет значение, которое отлично от значения Строки. Пустой, и я нахожу, что случай, чтобы быть менее, чем распространенным (но люди здесь дали законные примеры этого случая)".)

5
ответ дан 24 November 2019 в 00:47
поделиться

Почему вы хотите, чтобы ваша строка вообще инициализировалась? Вам не нужно инициализировать переменную, когда вы ее объявляете, и 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, компилятор выдаст ошибку, сообщающую, что не все пути кода присваивают значение. Конечно, это очень простой пример ...

Маттейс

13
ответ дан 24 November 2019 в 00:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: