Что это значит? - PullRequest
       6

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

36 голосов
/ 26 февраля 2020

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

public static void Something(string[] value)
{
   if (value is { })
   {
      DoSomethingElse();
   }
}

Ответы [ 3 ]

28 голосов
/ 26 февраля 2020

Это просто пустой шаблон свойства в C# 8, то есть значение не null. Соответствует любому типу значения или ссылочному типу. Как отмечает Panagiotis Kanavos в комментариях, это эквивалентно старой доброй проверке value is object, которая долгое время находилась в C#.

Как правило, если указать свойство, оно будет соответствовать или нет. Этот пример esoteri c показывает, что:

if (value is { Length: 2 })
{
   // matches any object that isn't `null` and has a property set to a length of 2
}

Шаблоны свойств работают лучше всего и наиболее понятны при сравнении с другими шаблонами в таких случаях, как switch выражения.

7 голосов
/ 26 февраля 2020

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

public async Task<IActionResult> Update(string id, ...) 
{
    if (ValidateId(id) is { } invalid)
        return invalid;
    ...
}

В приведенном выше примере ValidateId() может возвращать ноль или экземпляр BadObjectRequestResult. Если первый возвращается, проверка успешна и переходит к остальной части тела Update. Если последний возвращается, is {} равен true (то есть, конечно, экземпляр BadObjectRequestResult равен object), и проверка завершается неудачей.

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

public async Task<IActionResult> Update(string id, ...) 
{
    var invalid = ValidateId(id);
    if (invalid != null)
        return invalid;
    ...
}

Независимо от того, является ли один из них более читабельным или другой - для читателя, я только что представил один из способов использования шаблона пустого свойства.

0 голосов
/ 09 марта 2020

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

...