Ответы:
Это просто шаблон пустого свойства в C # 8, означающий, что это не так null
. Соответствует любому типу значения или ссылочному типу. Как отмечает в комментариях Панагиотис Канавос, это эквивалентно старой доброй value is object
проверке, которая долгое время была в C #.
Как правило, если вам нужно указать свойство, оно будет соответствовать или нет. Этот эзотерический пример показывает, что:
if (value is { Length: 2 })
{
// matches any object that isn't `null` and has a property set to a length of 2
}
Шаблоны свойств работают лучше всего и наиболее понятны при сравнении с другими шаблонами в таких случаях, как switch
выражения.
s
определенно не нуль. is {}
является сокращением, is object
и строки могут быть приведены к объекту.
!
, !!
, ?
и ??
до и после свойства означает различные вещи. Когда будет синтаксический сахар высокого класса?
value != null
?
Хотя ответ Дэниела верен, я думаю, что было бы полезно добавить некоторый контекст о том, почему вы можете увидеть использование пустого шаблона свойств. Рассмотрим этот пример метода контроллера, который нуждается в некоторой проверке:
public async Task<IActionResult> Update(string id, ...)
{
if (ValidateId(id) is { } invalid)
return invalid;
...
}
В приведенном выше, ValidateId()
может вернуть ноль или экземпляр BadObjectRequestResult
. Если первый возвращается, проверка прошла успешно и переходит к остальной части тела Update
. Если последний возвращается, is {}
имеет значение true (т. Е., Конечно, экземпляр BadObjectRequestResult
is является object
), и проверка не проходит.
Хорошо, из этого мы также предоставили имя переменной invalid
, которое мы можем вернуть немедленно. Без этого нам понадобился бы немного более подробный код.
public async Task<IActionResult> Update(string id, ...)
{
var invalid = ValidateId(id);
if (invalid != null)
return invalid;
...
}
Является ли одно более читабельным или другое зависит от читателя, я только что представил один способ использования пустого шаблона свойств.
is object invalid
, а неis {} invalid
IActionResult
(вполне технически Task<IActionResult>
). Если мы пойдем с вашим стилем, у if
него тот же результат, но invalid
он будет, object
поэтому он не скомпилируется.