нулевой условный оператор для типа даты? - PullRequest
0 голосов
/ 10 июля 2020

В моей модели у меня есть это свойство

public DateTime? ReleaseDate { get; set; }

Затем на моей странице бритвы Blazor у меня есть приведенный ниже код с синтаксической ошибкой

<td>@movie.ReleaseDate.ToString("dd-MMM-yyyy")</td>

Проблема в том, что ReleaseDate имеет значение NULL, но мой вопрос в том, как использовать оператор с условием NULL ? для получения текущей даты системы, если ReleaseDate имеет значение NULL?

Ответы [ 2 ]

5 голосов
/ 10 июля 2020

В вашем коде есть синтаксическая ошибка, поскольку DateTime допускает значение NULL? не имеет перегрузки ToString(), которая принимает параметр строкового формата, поэтому вам нужно получить .Value из обнуляемого, чтобы превратить обнуляемый в нормальный DateTime, прежде чем вы сможете его отформатировать

Чтобы ответить ваш конкретный c вопрос об условном null, тогда это будет примерно так:

(movie.ReleaseDate.HasValue ? movie.ReleaseDate.Value.ToString("dd-MMM-yyyy") : "Not Yet"

Форма Альсейна с использованием null coalesce намного более читабельна, чем использование условного null, но его выбор сказать, что mov ie был выпущен сегодня, если дата выпуска равна нулю, для меня это не имеет смысла. Я бы сказал, что нам нужен способ превратить его в строку даты, только если она имеет значение, и превратить ее в некоторую другую строку, если она равна нулю.

Учтите:

movie.ReleaseDate?.ToString("dd-MMM-yyyy") ?? "Not Yet"

Если дата выпуска равна нулю. ToString не будет вызываться, а c# сразу перейдет к ?? с нулевым результатом. ?? затем превратит ноль в строку «Еще нет», что, как я полагаю, может означать нулевая дата выпуска ..

? также работает неким c с обнуляемыми , превращая его в DateTime, если он имеет значение , поэтому более раннее «DateTime? не имеет ToString(string)» не применяется; к моменту вычисления movie.ReleaseDate? результатом будет либо null, либо нормальный DateTime с ToString, который принимает формат

??, таким образом, хороший способ дать значение по умолчанию для цепочки вызовы, любой из которых может быть нулевым и защищен от выдачи нулевой ссылки во многих случаях использования оператора ?:

notnull.MaybeNull?.MayAlsoBeNull?.Something ?? DefaultThing

Также подумайте, следует ли вам форматировать дату для пользователя, используя этот фиксированный способ , или было бы разумнее использовать типичный для их страны формат даты и представлять дату в разных форматах для разных посетителей сайта

Посмотрите что-то вроде этого или , возможно, это о том, как заставить ваш код использовать объявление языка пользователя для предоставления специфики культуры c форматирование для таких вещей, как даты и числа

3 голосов
/ 10 июля 2020

a ?? b (оператор объединения с нулем) - это сокращение от a == null ? a : b, что означает, что если a равно null, то возвращается b, иначе a.

Этот оператор требует, чтобы a имеет тип T? (допустимы как Nullable<T> (также известные как типы, допускающие значение NULL), так и ссылочные типы, допускающие значение NULL), а b имеет тип T или T?. Если b имеет тип T?, тип возвращаемого значения этого оператора также T?, что означает, что ?? можно связать в цепочку.

a ?? b ?? c ?? d означает, что сначала возвращается то, что не является нулевым.

(movie.ReleaseDate ?? DateTime.Now).ToString("dd-MMM-yyyy")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...