Ответы:
Это просто шаблон пустого свойства в 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 (т. Е., Конечно, экземпляр BadObjectRequestResultis является 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поэтому он не скомпилируется.