Я вижу повсюду конструкции вроде:
int? myVar = null;
string test = myVar.HasValue ? myVar.Value.ToString() : string.Empty;
Почему бы просто не использовать:
string test = myVar.ToString();
Разве это не то же самое? По крайней мере, Reflector говорит, что:
public override string ToString()
{
if (!this.HasValue)
{
return "";
}
return this.value.ToString();
}
Итак, это правильно (более короткая версия) или я что-то упустил?
Вы совершенно правы. Также в этом вопросе предлагается первое решение, хотя на самом деле никто не замечает, что ToString ()
уже дает правильный ответ.
Возможно, аргументом в пользу более подробного решения является удобочитаемость: когда вы вызываете ToString ()
для чего-то, что предполагается, что имеет значение null
, вы обычно ожидает NullReferenceException
, хотя здесь оно не генерируется.
Я думаю, что у многих есть такие проверки, потому что это неестественное поведение объекта, который может содержать нулевое значение.
Нет, вы правы, более короткая версия совпадает с тем, что сделали другие люди в этом отношении. Другой конструкцией, которую я часто использую вместо тернарной с нулевыми значениями, является оператор объединения с нулевым значением. который также защищает вас от нулей. Для ToString () это не обязательно (как вы указали), но для значений int по умолчанию (например) он отлично работает, например:
int page = currentPage ?? 1;
, который позволяет вам выполнять все целочисленные операции на странице без первой явной проверки на null и вызова для значения в currentPage (где currentPage - это целое число? Возможно, передается как параметр)
Может быть, это просто следование шаблону? Или они не знают бэкенд. Вы правы, код точно такой же. Вы даже можете сделать:
int? i = null;
i.ToString(); //No NullReferenceException