C# Academy · Lezione

Proteggersi dai null

Convalida e pattern.

Lezione 4 di 413 passaggi

Proteggersi dai null è una lezione C# Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C# Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C# Academy include 4 lezioni in totale.

Perché controllare i valori null?

Un metodo che riceve un null imprevisto spesso si arresta più avanti con una NullReferenceException difficile da interpretare, nel profondo dello stack delle chiamate.

Il controllo preliminare consiste nel verificare gli argomenti all'inizio e segnalare chiaramente l'errore, in modo che questo punti direttamente alla causa reale.

Controllo null classico

Il controllo preliminare più semplice consiste in una verifica esplicita che genera una ArgumentNullException quando un argomento obbligatorio è null.

In questo modo l'input viene validato al confine del metodo, prima che inizi qualsiasi operazione.

void Save(string path)
{
    if (path == null)
        throw new System.ArgumentNullException(nameof(path));
    System.Console.WriteLine(path);
}

Usare nameof

Passi nameof(path) invece di una stringa hard-coded. L'eccezione riporterà quindi il nome esatto del parametro e resterà corretta se il parametro viene rinominato.

Questo semplifica notevolmente il debug quando l'eccezione viene registrata.

void Greet(string user)
{
    if (user is null)
        throw new System.ArgumentNullException(nameof(user));
    System.Console.WriteLine("Hi " + user);
}

Helper ThrowIfNull

Le versioni moderne di C# offrono ArgumentNullException.ThrowIfNull(arg). Esegue il controllo null e genera automaticamente l'eccezione con il nome corretto del parametro.

È conciso ed è lo stile di controllo preliminare preferito nel codice .NET moderno.

void Process(object data)
{
    System.ArgumentNullException.ThrowIfNull(data);
    System.Console.WriteLine("Processing");
}

Un controllo eseguibile

Questo programma mostra un controllo preliminare che intercetta un argomento null e lo segnala in modo chiaro, invece di causare un arresto più avanti.

Lo esegua per vedere il messaggio dell'eccezione con il nome del parametro non valido.

using System;

class Program
{
    static void Print(string text)
    {
        ArgumentNullException.ThrowIfNull(text);
        Console.WriteLine(text);
    }

    static void Main()
    {
        try { Print(null); }
        catch (ArgumentNullException ex) { Console.WriteLine(ex.ParamName); }
    }
}

Controllo con ?? throw

È possibile combinare l'assegnazione e il controllo preliminare usando ?? con throw. In questo modo si valida e si memorizza il valore in una sola riga.

È uno schema molto usato nei costruttori quando si assegna un valore a un campo.

class Service
{
    private readonly string _name;
    public Service(string name)
        => _name = name ?? throw new System.ArgumentNullException(nameof(name));
}

Vuoto e null

Per le stringhe, null e stringa vuota sono problemi diversi. Usi string.IsNullOrEmpty o string.IsNullOrWhiteSpace per rilevarli entrambi contemporaneamente.

Un ArgumentException (non ArgumentNullException) è appropriato per un valore vuoto ma non null.

void SetName(string name)
{
    if (string.IsNullOrWhiteSpace(name))
        throw new System.ArgumentException("Name required", nameof(name));
}

Controlli con i pattern

I pattern is null e is not null sono chiari da leggere e non possono essere ingannati dagli operatori di uguaglianza sovraccaricati.

Preferisca is null a == null quando un tipo potrebbe ridefinire ==.

object value = null;
if (value is null)
    System.Console.WriteLine("It is null");
if (value is not null)
    System.Console.WriteLine("Has value");

Valore predefinito invece di un'eccezione

Non tutti i valori null rappresentano un errore. A volte è preferibile un valore predefinito sensato a un'eccezione.

Usi ?? quando null è accettabile e generi un'eccezione solo quando il valore è davvero obbligatorio.

string BuildPath(string folder)
{
    folder ??= "/tmp";
    return folder + "/file.txt";
}

I tipi riferimento nullable sono utili

Con i tipi riferimento nullable abilitati, il compilatore avvisa quando potrebbe essere dereferenziato un valore potenzialmente null, intercettando gli errori prima dell'esecuzione.

Dichiarare string (non null) invece di string? (nullable) documenta l'intento e guida l'analizzatore.

#nullable enable
string required = "ok";
string? optional = null;
System.Console.WriteLine(optional?.Length ?? 0);

Controllare e poi usare in sicurezza

Dopo aver eseguito il controllo preliminare all'inizio di un metodo, il resto del corpo può usare il valore senza ripetere i controlli null.

Questo programma esegue il controllo preliminare e poi usa l'argomento con sicurezza.

using System;

class Program
{
    static int Length(string s)
    {
        ArgumentNullException.ThrowIfNull(s);
        return s.Length;
    }

    static void Main()
    {
        Console.WriteLine(Length("hello"));
    }
}

Verifica rapida

Verifichi la Sua comprensione dei controlli contro i valori null.

Riepilogo

Controlli gli argomenti obbligatori all'inizio del metodo. Usi ArgumentNullException.ThrowIfNull oppure ?? throw con nameof per ottenere errori chiari.

Usi string.IsNullOrWhiteSpace per le stringhe vuote, i pattern is null per controlli sicuri e ?? quando è accettabile usare un valore predefinito invece di generare un errore.

Gratis per iniziare

Impara C# con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
93
Lezioni
346

Domande Frequenti

La lezione «Proteggersi dai null» è gratuita?

Sì — il testo completo di «Proteggersi dai null» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C# Academy, passa a CoddyKit PRO. Il corso C# Academy include 4 lezioni in totale.

Cosa imparerò in «Proteggersi dai null»?

Convalida e pattern. Eserciti C# Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare C# Academy?

Non è richiesta alcuna esperienza precedente. C# Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «Proteggersi dai null»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione C# Academy?

Sì. Ogni lezione C# Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Tipi di valore nullable
  2. Operatore null-conditional
  3. Operatori null-coalescing
  4. Proteggersi dai null
← Torna a C# Academy