Cosa significa?


36

A volte vedo il seguente codice e non ho idea di cosa stia testando l'espressione.

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

Risposte:


28

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.


1
cosa significa oggetto vuoto in questo caso? stringa vuota, spazio bianco?
OlegI,

3
@OlegI no, non lo è. snon è assolutamente nullo. is {}è una scorciatoia per is objecte le stringhe possono essere lanciate sull'oggetto.
Panagiotis Kanavos,

6
@OlegI come? è un riferimento valido quindi corrisponde.
Daniel A. White,

3
Il suo un nuovo mondo dove le strutture possono essere nullo e riferimenti non può essere nullo, istruzioni switch sono invertiti e vari !, !!, ?e ??prima e dopo le proprietà significano cose diverse. Quando finirà lo zucchero sintattico?
Ja72,

3
È lo stesso di value != null?
ca9163d9,

7

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.


In quel caso si dovrebbe usare is object invalid, nonis {} invalid
Panagiotis Kanavos il

1
@PanagiotisKanavos che non funzionerebbe in questo caso perché 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.
Kit

0

Penso che sia per verificare se il valore è un oggetto vuoto

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.