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 objectcontrollo 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 switchespressioni.
snon è assolutamente nullo. is {}è una scorciatoia per is objecte 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, ifha lo stesso risultato ma invalidsarà un objectcosì che non verrà compilato.