Я везде вижу конструкции типа:
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()
работает безNullReferenceException
броска..HasValue
равно ожидали бы выбросить это исключение.myNullableDateTime.HasValue ? myNullableDateTime.Value.ToString("d") : null
где вам нужен развернутый объект для доступа к желаемомуToString
методу. Конечно, для этого есть более лаконичное решение:$"{myNullableDateTime:d}"
Я думаю, что у многих есть такие проверки, потому что это неестественное поведение объекта, который может содержать нулевое значение.
источник
Нет, вы правы, более короткая версия совпадает с тем, что сделали другие люди в этом отношении. Другой конструкцией, которую я часто использую вместо тернарной с значениями NULL, является оператор объединения NULL. который также защищает вас от нулей. Для ToString () это не обязательно (как вы указали), но для значений int по умолчанию (например) он работает хорошо, например:
int page = currentPage ?? 1;
который позволяет вам выполнять все целочисленные операции на странице без первой явной проверки на null и вызова значения в currentPage (где currentPage - это int? возможно, передается как параметр)
источник
Я знаю, спустя долгое время это стало актуальным, но ... Я подозреваю, что это потому, что для типов, допускающих значение NULL, таких как int? метод .ToString () не позволяет использовать строки формата. См. Раздел Как отформатировать объект DateTime, допускающий значение NULL, с помощью ToString ()? . Возможно, в исходном коде в .ToString () была строка формата, или, возможно, кодировщик забыл, что .ToString () без строки формата все еще доступен для типов, допускающих значение NULL.
источник
может быть это просто следование шаблону? или они не знают серверную часть. вы правы код точно такой же. вы даже можете:
int? i = null; i.ToString(); //No NullReferenceException
источник
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:
Таким образом, следующий код будет выводить на консоль пустую строку вместо того, чтобы генерировать
ArgumentNullException
исключение.static void Main(string[] args) { int? a = null; Console.WriteLine(a.ToString()); // Prints empty string to console. }
источник