Risposte:
Questo è solo il modello di proprietà vuoto in C # 8, il che significa che il valore no null
. Corrisponde a qualsiasi tipo di valore o tipo di riferimento. Come osserva Panagiotis Kanavos nei commenti, questo equivale al buon vecchio value is object
controllo che è stato in C # per molto tempo.
In genere, se si dovesse specificare una proprietà, corrisponderebbe o meno. Questo esempio esoterico mostra che:
if (value is { Length: 2 })
{
// matches any object that isn't `null` and has a property set to a length of 2
}
I modelli di proprietà funzionano meglio e sono più chiari se confrontati con altri modelli in casi come le switch
espressioni.
s
non è assolutamente nullo. is {}
è una scorciatoia per is object
e le stringhe possono essere lanciate sull'oggetto.
!
, !!
, ?
e ??
prima e dopo le proprietà significano cose diverse. Quando finirà lo zucchero sintattico?
value != null
?
Mentre la risposta di Daniel è giusta, penso che potrebbe essere utile aggiungere un po 'di contesto sul perché potresti vedere il modello di proprietà vuoto in uso. Considera questo metodo di controller di esempio che richiede una convalida:
public async Task<IActionResult> Update(string id, ...)
{
if (ValidateId(id) is { } invalid)
return invalid;
...
}
In quanto sopra, ValidateId()
potrebbe restituire null o un'istanza di BadObjectRequestResult
. Se viene restituito il primo, la convalida ha esito positivo e passa al resto del corpo di Update
. Se quest'ultimo viene restituito, is {}
è vero (cioè ovviamente un'istanza di BadObjectRequestResult
è an object
) e la validazione fallisce.
Bene, da questo abbiamo anche fornito un nome variabile invalid
, che possiamo restituire immediatamente. Senza quello avremmo bisogno di un codice leggermente più dettagliato.
public async Task<IActionResult> Update(string id, ...)
{
var invalid = ValidateId(id);
if (invalid != null)
return invalid;
...
}
Se uno è più leggibile o l'altro dipende dal lettore, ho appena presentato un modo in cui è possibile utilizzare il modello di proprietà vuoto.
is object invalid
, nonis {} invalid
IActionResult
è richiesto un ritorno di (ben tecnicamente Task<IActionResult>
). Se andiamo con il tuo stile, if
ha lo stesso risultato ma invalid
sarà un object
così che non verrà compilato.