Що означає "є {}"?


36

Я інколи бачу такий код, і поняття не маю, що вираз насправді тестує.

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

Відповіді:


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
що означає порожній об’єкт у цьому випадку? порожня рядок, пробіл?
ОлегІ

3
@OlegI ні, це не так. sоднозначно не є нульовим. is {}є скороченням, is objectі рядки можуть бути передані об'єкту.
Панайотис Канавос

6
@OlegI як так? його дійсна посилання, так що вона відповідає.
Даніель А. Білий

3
Його новий світ , в якому може бути Структури втратила посилання не може бути нульовою, заяви перемикач переплутані і різні !, !!, ?і ??до і після властивості означає різні речі. Коли закінчиться синтаксичний цукор?
ja72

3
Це те саме, що value != null?
ca9163d9

7

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

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

У вищесказаному, ValidateId()можна повернути null або екземпляр BadObjectRequestResult. Якщо перше повертається, перевірка проходить успішно і переходить до іншої частини тіла Update. Якщо останній повертається, is {}є істинним (тобто, звичайно, екземпляр BadObjectRequestResultє an object), і перевірка завершується невдаче.

Непогано, що ми також дали ім'я змінної invalid, до якого ми можемо повернутися негайно. Без цього нам знадобиться трохи більше деталізованого коду.

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

Незалежно від того, чи читається одна чи інша - це читач, я тільки що представив один із способів використання порожньої структури властивостей.


У такому випадку варто скористатися is object invalid, а неis {} invalid
Панайотис Канавос,

1
@PanagiotisKanavos, яка б не працювала в цьому випадку, оскільки потрібно повернення ( IActionResultце технічно Task<IActionResult>). Якщо ми підемо з вашим стилем, результат ifмає той самий результат, але invalidбуде objectтаким, що не буде компілюватися.
Кіт

0

Я думаю, це перевірити, чи є значення порожнім об'єктом

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.