ToString в пустой строке - PullRequest
       35

ToString в пустой строке

22 голосов
/ 25 января 2011

Почему второй из них создает исключение, а первый нет?

string s = null;
MessageBox.Show(s);
MessageBox.Show(s.ToString());

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

Например:

string s = null, msg;
msg = "Message is " + s; //no error
msg = "Message is " + s.ToString(); //error

Первая часть, по-видимому, неявно преобразует ноль в пустую строку.

Ответы [ 8 ]

26 голосов
/ 25 января 2011

, потому что вы не можете вызвать метод экземпляра ToString() для ссылки null.

И MessageBox.Show(), вероятно, реализован, чтобы игнорировать нуль и распечатать пустое окно сообщения.

13 голосов
/ 25 января 2011

Это потому, что MessageBox.Show () реализован с помощью pinvoke, он вызывает встроенную функцию Windows MessageBox (). Который не против получить значение NULL для аргумента lpText. Язык C # имеет гораздо более строгие правила для чистых методов экземпляра .NET (например, ToString), он всегда генерирует код, чтобы убедиться, что объект не является нулевым. В этом блоге .

содержится некоторая справочная информация.
5 голосов
/ 26 февраля 2018

Поскольку в Google этот вопрос занимает довольно высокое место в поиске "c # toString null", я хотел бы добавить, что метод Convert.ToString(null) возвращает пустую строку.

Однако, чтобы подтвердить остальные ответы, вы можете использовать string.Concat("string", null) в этом примере.

5 голосов
/ 18 апреля 2012

За кулисами вызывается concat в вашем последующем вопросе / обновлении. Например:

string snull = null;

string msg = "hello" + snull;

// is equivalent to the line below and concat handles the null string for you.
string msg = String.Concat("hello", snull);

// second example fails because of the toString on the null object
string msg = String.Concat("hello", snull.ToString());

//String.Format, String.Convert, String.Concat all handle null objects nicely.
3 голосов
/ 25 января 2011

Вы пытаетесь выполнить метод ToString () со значением NULL. Вам нужен действительный объект для выполнения метода.

1 голос
/ 25 января 2011

Функция .show должна иметь проверку на ноль и обрабатывать ее.

0 голосов
/ 25 января 2011

Вероятно, метод Show обрабатывает нулевое значение и просто ничего не показывает. Второе использование s - s.ToString () завершается неудачно, потому что у вас нет метода ToString для запуска.

0 голосов
/ 25 января 2011

Поскольку второй вызов ожидает, что объект "s" удовлетворит запрос метода ToString ().поэтому перед вызовом .Show () s.ToString () завершится с ошибкой при попытке вызвать метод.

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

...