“{}” Ne anlama geliyor?


36

Bazen aşağıdaki kodu görüyorum ve ifadenin aslında ne test ettiğini hiç bilmiyorum.

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

Yanıtlar:


28

Bu sadece C # 8'deki boş özellik paterni, yani değer değil null. Herhangi bir değer türüyle veya referans türüyle eşleşir. Panagiotis Kanavos'un yorumlarda belirttiği gibi, bu value is objectuzun zamandır C # 'da olan eski iyi kontrole eşdeğerdir .

Genellikle bir mülk belirtirseniz, eşleşir veya eşleşmez. Bu ezoterik örnek şunları göstermektedir:

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

Özellik kalıpları en iyi sonucu verir ve switchifadeler gibi durumlarda diğer kalıplarla karşılaştırıldığında daha açıktır .


1
bu durumda boş nesne ne demektir? boş dize, beyaz boşluk?
OlegI

3
@OlegI hayır değil. sdefinitelly boş değil. is {}için steno olan is objectve dizeleri edebilir nesneye döküm.
Panagiotis Kanavos

6
@OlegI nasıl yani? geçerli bir referans olduğu için eşleşir.
Daniel A. White

3
Onun yapılar boş olabilir ve referanslar null olamaz yeni bir dünya, anahtar ifadeleri ters ve çeşitli edilir !, !!, ?ve ??önce ve sonra özelliklerinin farklı anlamlara gelir. Sözdizimsel şeker ne zaman sona erecek?
ja72

3
İle aynı value != nullmı?
ca9163d9

7

Daniel'in yanıtı doğru olsa da, neden boş mülk modelini kullanımda gördüğünüze dair bir bağlam eklemek yararlı olabilir. Bazı doğrulamaların yapılması gereken bu örnek denetleyici yöntemini düşünün:

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

Yukarıda, ValidateId()null veya bir örneği döndürebilir BadObjectRequestResult. Birincisi iade edilirse, doğrulama başarılı olur ve vücudunun geri kalanına geçer Update. İkincisi iade edilirse, is {}olduğu doğrudur (yani, tabii ki bir örneği BadObjectRequestResultbir olan object), ve doğrulama başarısız olur.

Güzel, bundan da değişken bir isim verdik, invalid hemen geri dönebileceğimiz . Bu olmadan biraz daha ayrıntılı koda ihtiyacımız olurdu.

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

Biri daha okunabilir veya diğeri okuyucuya bağlı olsun, boş özellik deseninin kullanılabileceği bir yol sundum.


Bu durumda, is object invalid değilis {} invalid
Panagiotis Kanavos

1
@PanagiotisKanavos bu durumda işe yaramayacak çünkü geri dönüşü IActionResultgerekli (teknik olarak iyi Task<IActionResult>). Tarzınızla gidersek if, aynı sonuç elde edilir, ancak invalidbu bir objectderleme olmayacaktır.
Kit

0

Sanırım değerin boş bir nesne olup olmadığını kontrol etmek

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.