Что это значит?

36

Иногда я вижу следующий код и понятия не имею, что на самом деле проверяет выражение.

public static void Something(string[] value)
{
   if (value is { })
   {
      DoSomethingElse();
   }
}
Evan
источник

Ответы:

28

Это просто шаблон пустого свойства в 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выражения.

Даниэль А. Уайт
источник
1
что означает пустой объект в этом случае? пустая строка, пробел?
OlegI
3
@ Олег, нет, это не так. sопределенно не нуль. is {}является сокращением, is objectи строки могут быть приведены к объекту.
Панагиотис Канавос
6
@ Олег, как так? это действительная ссылка, поэтому он соответствует.
Дэниел А. Уайт
3
Его новый мир , в котором может быть Структуры утратившей ссылка не может быть нулевой, заявления переключатель перепутаны и различные !, !!, ?и ??до и после свойства означает различные вещи. Когда будет синтаксический сахар высокого класса?
ja72
3
Это так же, как value != null?
ca9163d9
7

Хотя ответ Дэниела верен, я думаю, что было бы полезно добавить некоторый контекст о том, почему вы можете увидеть использование пустого шаблона свойств. Рассмотрим этот пример метода контроллера, который нуждается в некоторой проверке:

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
Panagiotis Kanavos
1
@PanagiotisKanavos, который не будет работать в этом случае, потому что требуется возврат IActionResult(вполне технически Task<IActionResult>). Если мы пойдем с вашим стилем, у ifнего тот же результат, но invalidон будет, objectпоэтому он не скомпилируется.
Кит
0

Я думаю, что это проверить, является ли значение пустым объектом

Nehemie
источник