Nullable ToString () - PullRequest
       10

Nullable ToString ()

134 голосов
/ 15 марта 2010

Я вижу везде такие конструкции, как:

int? myVar = null;
string test = myVar.HasValue ? myVar.Value.ToString() : string.Empty;

Почему бы не использовать просто:

string test = myVar.ToString();

Разве это не то же самое? По крайней мере, Отражатель говорит, что:

public override string ToString()
{
  if (!this.HasValue)
  {
    return "";
  }
  return this.value.ToString();
}

Итак, это правильно (более короткая версия) или я что-то упустил?

Ответы [ 6 ]

108 голосов
/ 15 марта 2010

Вы совершенно правы. Также в этом вопросе предлагается первое решение, хотя никто на самом деле не замечает, что ToString() уже дает правильный ответ.

Возможно, аргументом для более подробного решения является удобочитаемость: когда вы вызываете ToString() для чего-то, что должно быть null, вы обычно ожидаете a NullReferenceException , хотя здесь это не брошено.

14 голосов
/ 15 марта 2010

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

5 голосов
/ 02 апреля 2013

Я знаю, еще долгое время после того, как это было актуально, но ... я подозреваю, что это потому, что для таких типов, как int, можно обнуляться. метод .ToString () не позволяет использовать строки формата. См. Как отформатировать обнуляемый DateTime с помощью ToString ()? . Возможно, в исходном коде была строка формата в .ToString (), или, возможно, кодировщик забыл, что .ToString () без строки формата все еще был доступен для типов, допускающих значение NULL.

5 голосов
/ 15 марта 2010

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

int page = currentPage ?? 1;

, который позволяет вам выполнять все целочисленные операции на странице без первой явной проверки на ноль и вызова значения в currentPage (где currentPage - это int? Возможно, переданный как параметр)

3 голосов
/ 15 марта 2010

может быть, это просто следовать шаблону? или они не знают бэкэнда. Вы правы, код точно такой же. Вы даже можете сделать:

int? i = null;
i.ToString(); //No NullReferenceException
1 голос
/ 18 января 2019

int? - это синтаксический сахар, который упрощает объявление переменной, допускающей значение NULL. Это так же, как Nullable<int>.

Таким образом, если вы посмотрите на реализацию ToString() метода для Nullable<T> (см. Ниже) , вы можете заметить, что он возвращает пустую строку в случае, если у нее нет значения.

public struct Nullable<T> where T : struct
{
    public override string ToString()
    {
      if (!this.hasValue)
        return "";
      return this.value.ToString();
    }
}

Что MSDN говорит:

Метод Nullable.ToString

Возвращает текстовое представление значения текущего объекта Nullable если свойство HasValue равно true, или пустая строка (""), если Свойство HasValue имеет значение false.

Таким образом, следующий код выведет пустую строку в консоль, а не выдаст ArgumentNullException исключение.

static void Main(string[] args)
{
    int? a = null;
    Console.WriteLine(a.ToString()); // Prints empty string to console.
}
...