Иногда я вижу следующий код и понятия не имею, что на самом деле проверяет выражение.
public static void Something(string[] value)
{
if (value is { })
{
DoSomethingElse();
}
}
Это просто шаблон пустого свойства в 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
?Хотя ответ Дэниела верен, я думаю, что было бы полезно добавить некоторый контекст о том, почему вы можете увидеть использование пустого шаблона свойств. Рассмотрим этот пример метода контроллера, который нуждается в некоторой проверке:
В приведенном выше,
ValidateId()
может вернуть ноль или экземплярBadObjectRequestResult
. Если первый возвращается, проверка прошла успешно и переходит к остальной части телаUpdate
. Если последний возвращается,is {}
имеет значение true (т. Е., Конечно, экземплярBadObjectRequestResult
is являетсяobject
), и проверка не проходит.Хорошо, из этого мы также предоставили имя переменной
invalid
, которое мы можем вернуть немедленно. Без этого нам понадобился бы немного более подробный код.Является ли одно более читабельным или другое зависит от читателя, я только что представил один способ использования пустого шаблона свойств.
источник
is object invalid
, а неis {} invalid
IActionResult
(вполне техническиTask<IActionResult>
). Если мы пойдем с вашим стилем, уif
него тот же результат, ноinvalid
он будет,object
поэтому он не скомпилируется.Я думаю, что это проверить, является ли значение пустым объектом
источник