Uno degli errori più comuni che si commettono nella scrittura del codice è il non controllare se un oggetto sia istanziato o meno prima di utilizzare i membri (metodi, proprietà, e così via). Per controllare se effettivamente l'oggetto è istanziato dobbiamo quindi eseguire una if come ne seguente esempio.
if (obj != null) { obj.ExecuteMethod(); }
Quando abbiamo molti oggetti da controllare il codice diventa ripetitivo e quindi facilmente soggetto a errori. C# 6 introduce il Null-conditional operatore che introduce una shortcut per evitare di riempire il codice di controlli sull'istanziazione di un oggetto. Nel prossimo esempio vediamo come possiamo scrivere lo stesso codice visto in precedenza.
obj?.ExecuteMethod();
Aggiungendo il carattere ? alla fine della variabile che rappresenta l'oggetto, indichiamo al compilatore che il metodo (o la proprietà o altro ancora) deve essere acceduto solo se l'oggetto non è null. Come si può immaginare, questa funzionalità di C# riduce drasticamente le linee di codice da scrivere, anche in virtù di alcune peculiarità. Prendiamo il seguente codice come esempio.
int? length = people?.Length; int length = people?.Length ?? 0; Person first = people?[0]; int? first = people?[0].Children?.Count();
Nel primo esempio la proprietà Length è di tipo Int32, ma poichè usiamo il null-conditional operator, il risultato dell'istruzione è un tipo Int32? in quanto se people è null l'istruzione tornerà null. Il secondo esempio mostra come ottenere sempre un valore Int32 combinando il null-coalesce operator con il null-conditional operator. Nel terzo esempio possiamo vedere che il null-conditional operator si applica anche agli indexer, mentre il quarto esempio mostra come si possano anche innestare diverse chiamate.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Gestire il breaking change di Entity Framework Core 7 con tabelle che usano identity e trigger
GitHub Actions e Terraform: l'infrastruttura, dalla definizione al deploy
Usare domini personalizzati con Azure Container App
Autenticazione basata su certificati con ASP.NET Core
Definire la durata dell'output cache in ASP.NET Core 7
Utilizzo di Map e Object in Javascript
Recuperare un elemento inserito nella cache del browser tramite API JavaScript
Applicare il versioning ai nostri endpoint ASP.NET Core Minimal API
Gestire condizioni complesse in JavaScript
Migrare un repository che contiene large file storage objects in GitHub
Recuperare la data di creazione e ultima modifica di un record con Entity Framework Core e le temporal table di SQL Server
Impostare il forward degli header in un sito ASP.NET Core dietro a un reverse proxy