Menu
Coddy logo textTech

Operatori null-aware

Fa parte della sezione Programmazione orientata agli oggetti del percorso Dart di Coddy. Lezione 27 di 110.

Oltre a ?. e !, Dart fornisce operatori aggiuntivi che rendono più conciso il lavoro con valori nullable. Questi operatori che gestiscono i valori null ti aiutano a scrivere codice più pulito quando hai a che fare con possibili valori null.

L'operatore di coalescenza null ?? restituisce il valore a sinistra se non è null, altrimenti restituisce quello a destra:

String? nickname;
String displayName = nickname ?? 'Guest';
print(displayName);  // Guest

nickname = 'Alex';
displayName = nickname ?? 'Guest';
print(displayName);  // Alex

L'operatore di assegnazione con consapevolezza dei valori null ??= assegna un valore solo se la variabile è attualmente null:

String? username;
username ??= 'Anonymous';
print(username);  // Anonymous

username ??= 'NewName';
print(username);  // Still Anonymous (wasn't null)

Puoi concatenare l'operatore di accesso null-aware ?. per le proprietà annidate:

String? city = user?.address?.city;  // Sicuro anche se user o address è null

Questi operatori si combinano bene tra loro. Per esempio, potresti accedere a una proprietà nullable e fornire un valore predefinito:

String greeting = user?.name ?? 'Stranger';
// Se user è null OPPURE user.name è null, usa 'Stranger'

L'uso di questi operatori mantiene il codice leggibile garantendo la sicurezza rispetto ai valori null in tutto il programma.

challenge icon

Sfida

Facile

Costruiamo un sistema di registrazione degli ospiti che mostri come gli operatori consapevoli di null possano rendere il codice più pulito quando gestisci informazioni facoltative.

Organizzerai il codice in due file:

  • guest.dart: definisci una classe Guest che rappresenti qualcuno che partecipa a un evento. Alcuni ospiti forniscono tutti i dettagli, mentre altri danno solo le informazioni essenziali. La tua classe dovrebbe avere:
    • Un String name non nullable: ogni ospite deve avere un nome
    • Un String? email nullable: non tutti forniscono un indirizzo email
    • Un String? dietaryPreference nullable: alcuni ospiti non specificano esigenze alimentari
    • Un costruttore che accetta name come parametro obbligatorio
    • Un metodo getDisplayEmail() che restituisce l'email se disponibile, oppure 'No email provided' usando l'operatore ??
    • Un metodo assignDefaultDiet() che imposta dietaryPreference su 'Standard' solo se al momento è null, usando l'operatore ??=
    • Un metodo getEmailDomain() che restituisce la lunghezza dell'email usando ?., oppure null se non esiste un'email
    • Un metodo printBadge() che stampa le informazioni sul badge dell'ospite
  • main.dart: importa la tua classe guest e registra tre ospiti con diversi livelli di informazioni:
    • Crea un ospite di nome 'Alice', imposta la sua email su 'alice@company.com' e la preferenza alimentare su 'Vegetarian'
    • Crea un ospite di nome 'Bob', imposta solo la sua email su 'bob@email.org' (lascia la preferenza alimentare null)
    • Crea un ospite di nome 'Charlie' (lascia sia l'email sia la preferenza alimentare null)
    • Chiama assignDefaultDiet() per tutti e tre gli ospiti
    • Per ogni ospite, nell'ordine, chiama printBadge(), poi stampa Email length: [result] usando getEmailDomain()

Il metodo printBadge() dovrebbe stampare in questo formato:

=== Guest Badge ===
Name: [name]
Email: [getDisplayEmail()]
Diet: [dietaryPreference or "Not specified"]

Nota che la preferenza alimentare di Alice resta 'Vegetarian' perché ??= assegna un valore solo quando il valore è null, mentre a Bob e Charlie viene assegnata la dieta predefinita 'Standard'.

Output previsto:

=== Guest Badge ===
Name: Alice
Email: alice@company.com
Diet: Vegetarian
Email length: 17
=== Guest Badge ===
Name: Bob
Email: bob@email.org
Diet: Standard
Email length: 13
=== Guest Badge ===
Name: Charlie
Email: No email provided
Diet: Standard
Email length: null

Provalo tu

import 'guest.dart';

void main() {
  // TODO: Crea un ospite di nome 'Alice'
  // Imposta la sua email su 'alice@company.com'
  // Imposta la sua preferenza alimentare su 'Vegetarian'

  // TODO: Crea un ospite di nome 'Bob'
  // Imposta solo la sua email su 'bob@email.org'
  // Lascia la preferenza alimentare a null

  // TODO: Crea un ospite di nome 'Charlie'
  // Lascia sia l'email sia la preferenza alimentare a null

  // TODO: Chiama assignDefaultDiet() per tutti e tre gli ospiti

  // TODO: Per ogni ospite, nell'ordine (Alice, Bob, Charlie):
  // - Chiama printBadge()
  // - Stampa 'Email length: [result]' usando getEmailDomain()
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore Dart online