ToString для нулевой строки

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

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

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

Eg :

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

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


person MartW    schedule 25.01.2011    source источник
comment
Безопасный способ - см. Как сделать ToString для возможно нулевого объекта?   -  person Michael Freidgeim    schedule 05.08.2016
comment
Во избежание null повреждения струны или предмета obj?.ToString() ?? ""   -  person bvj    schedule 05.01.2017
comment
Во второй строке ошибка возникает из-за того, что вы вызываете метод (.ToString()) для ссылки на нулевую строку. Вот почему вы получаете исключение.   -  person Cosmin Sontu    schedule 16.07.2020


Ответы (8)


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

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

person Axarydax    schedule 25.01.2011
comment
Первый бит в порядке, но я думаю, что бит MessageBox моего вопроса отвлекает, поэтому мое обновление. - person MartW; 25.01.2011

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

person Hans Passant    schedule 25.01.2011

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

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

Изменить - измененный ответ в соответствии с комментарием HeyJude ниже. Как уже отмечалось, такой метод, как Convert.ToString(null).Length, вызовет исключение.

person RooiWillie    schedule 26.02.2018
comment
Convert.ToString(null) возвращает нулевое значение, а не пустую строку (это можно проверить, вызвав Convert.ToString(null) == null, который возвращает true). Однако передача нулевого значения variable действительно равно нулю, так что object v = null; Convert.ToString(v) == string.Empty возвращает true (см. этот ответ). - person OfirD; 15.07.2020
comment
@HeyJude - хорошо замечено, спасибо! Я обновлю соответственно. - person RooiWillie; 16.07.2020

За кулисами 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.
person James    schedule 18.04.2012
comment
Можете ли вы показать нам это за кулисами, потому что я точно не могу найти его в mscorlib... - person Robert Koritnik; 02.10.2012
comment
Итак, вы имеете в виду, что методы утилиты String просто преобразуют ее в «нулевую» строку, если возвращаемое значение равно null? - person Snehal Masne; 08.04.2015
comment
@RobertKoritnik Используйте ildasm.exe для скомпилированного примера кода, и вы увидите, что написал Джеймс. - person Kobor42; 06.10.2015
comment
Извините, но это золото, когда у вас есть целые числа, допускающие значение NULL. Вы можете написать строку s = + myInt; Спасибо, 6 лет спустя! - person Francois Girard; 19.09.2018

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

person Tomas McGuinness    schedule 25.01.2011

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

person rcravens    schedule 25.01.2011
comment
Как уже говорили другие, исключение возникает, потому что метод вызывается для нулевой ссылки. - person Vinzz; 25.01.2011
comment
Верно. Это очевидная часть. - person rcravens; 25.01.2011

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

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

person gbvb    schedule 25.01.2011

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

person user586138    schedule 25.01.2011