Yanıtlar:
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 object
uzun 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 switch
ifadeler gibi durumlarda diğer kalıplarla karşılaştırıldığında daha açıktır .
s
definitelly boş değil. is {}
için steno olan is object
ve dizeleri edebilir nesneye döküm.
!
, !!
, ?
ve ??
önce ve sonra özelliklerinin farklı anlamlara gelir. Sözdizimsel şeker ne zaman sona erecek?
value != null
mı?
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 BadObjectRequestResult
bir 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.
is object invalid
değilis {} invalid
IActionResult
gerekli (teknik olarak iyi Task<IActionResult>
). Tarzınızla gidersek if
, aynı sonuç elde edilir, ancak invalid
bu bir object
derleme olmayacaktır.