Menu
Coddy logo textTech

Gli operatori ? e !

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

Quando lavori con tipi nullable, Dart fornisce due operatori essenziali per accedere ai valori in modo sicuro. L'operatore di accesso null-aware ?. e l'operatore di asserzione non-null ! ti consentono di controllare come gestire i valori potenzialmente null.

L'operatore ?. accede in modo sicuro alle proprietà o ai metodi di un valore nullable. Se il valore è null, l'intera espressione restituisce null invece di causare un arresto anomalo:

String? name = 'Alice';
print(name?.length);  // 5

name = null;
print(name?.length);  // null (nessun crash!)

L’operatore ! dice a Dart: «Sono certo che questo valore non sia null». Converte un tipo nullable in un tipo non nullable, ma genera un errore se il valore è effettivamente null:

String? maybeName = 'Bob';
String definite = maybeName!;  // OK - affermiamo che non è null
print(definite.length);  // 3

String? empty = null;
// String crash = empty!;  // Errore a runtime! Il valore era null

Usa ?. quando vuoi gestire con eleganza i valori null. Usa ! solo quando sei assolutamente certo che un valore esista, magari dopo averlo verificato con un'istruzione if o quando sai che la logica garantisce un valore. Usare troppo ! vanifica lo scopo della sicurezza dai valori null e può causare arresti anomali in fase di esecuzione.

challenge icon

Sfida

Facile

Creiamo un sistema di inventario dei prodotti che mostra come lavorare in sicurezza con valori nullable usando gli operatori ?. e !.

Creerai due file per organizzare il tuo codice:

  • product.dart: definisci una classe Product che rappresenta un articolo nell'inventario. Alcuni prodotti hanno informazioni complete, mentre altri sono ancora in fase di catalogazione. La tua classe dovrebbe avere:
    • Un String name non nullable: ogni prodotto deve avere un nome
    • Un double price non nullable: ogni prodotto deve avere un prezzo
    • Un String? description nullable: alcuni prodotti non hanno ancora una descrizione
    • Un String? category nullable: alcuni prodotti non sono ancora stati categorizzati
    • Un costruttore che accetta name e price come parametri obbligatori
    • Un metodo getDescriptionLength() che restituisce la lunghezza della descrizione usando ?., oppure null se non c'è una descrizione
    • Un metodo getCategoryUppercase() che restituisce la categoria in maiuscolo usando !: questo metodo presuppone che la categoria sia stata impostata
    • Un metodo displayProduct() che stampa le informazioni sul prodotto, mostrando No description quando la descrizione è null e Uncategorized quando la categoria è null
  • main.dart: importa la tua classe del prodotto e mostra entrambi gli operatori:
    • Crea un prodotto chiamato 'Laptop' con prezzo 999.99, poi imposta la sua descrizione su 'High-performance computing device' e la categoria su 'Electronics'
    • Crea un prodotto chiamato 'Mystery Item' con prezzo 49.99 (lascia description e category impostati su null)
    • Per Laptop: chiama displayProduct(), stampa Description length: [length] usando getDescriptionLength() e stampa Category: [uppercase] usando getCategoryUppercase()
    • Per Mystery Item: chiama displayProduct() e stampa Description length: [length] usando getDescriptionLength() (verrà mostrato null)

Il metodo displayProduct() dovrebbe stampare nel seguente formato:

Product: [name] - $[price]
Description: [description or "No description"]
Category: [category or "Uncategorized"]

Output previsto:

Product: Laptop - $999.99
Description: High-performance computing device
Category: Electronics
Description length: 32
Category: ELECTRONICS
Product: Mystery Item - $49.99
Description: No description
Category: Uncategorized
Description length: null

Provalo tu

import 'product.dart';

void main() {
  // TODO: Crea un prodotto chiamato 'Laptop' con prezzo 999.99
  // Poi imposta la sua descrizione su 'High-performance computing device'
  // E imposta la sua categoria su 'Electronics'
  
  // TODO: Crea un prodotto chiamato 'Mystery Item' con prezzo 49.99
  // Lascia descrizione e categoria a null
  
  // TODO: Per Laptop:
  // - Chiama displayProduct()
  // - Stampa "Description length: [length]" usando getDescriptionLength()
  // - Stampa "Category: [uppercase]" usando getCategoryUppercase()
  
  // TODO: Per Mystery Item:
  // - Chiama displayProduct()
  // - Stampa "Description length: [length]" usando getDescriptionLength()
}
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