C# Language Utilizzo delle nozioni di base sulle istruzioni


Esempio

using dello zucchero sintattico consente di garantire che una risorsa venga pulita senza bisogno di un blocco try-finally esplicito. Questo significa che il tuo codice sarà molto più pulito e non perderai risorse non gestite.

Standard Dispose cleanup pattern, per gli oggetti che implementano l'interfaccia IDisposable (che la classe base Stream FileStream esegue in .NET):

int Foo()
{
    var fileName = "file.txt";

    {
        FileStream disposable = null;

        try
        {
            disposable = File.Open(fileName, FileMode.Open);

            return disposable.ReadByte();
        }
        finally
        {
            // finally blocks are always run
            if (disposable != null) disposable.Dispose();
        }
    }
}

using semplifica la sintassi nascondendo l'esplicito try-finally :

int Foo()
{
    var fileName = "file.txt";

    using (var disposable = File.Open(fileName, FileMode.Open))
    {
        return disposable.ReadByte();
    }
    // disposable.Dispose is called even if we return earlier
}

Proprio come i blocchi finally eseguono sempre indipendentemente da errori o ritorni, using sempre chiamate Dispose() , anche in caso di errore:

int Foo()
{
    var fileName = "file.txt";

    using (var disposable = File.Open(fileName, FileMode.Open))
    {
        throw new InvalidOperationException();
    }
    // disposable.Dispose is called even if we throw an exception earlier
}

Nota: Poiché si garantisce che Dispose sia chiamato indipendentemente dal flusso del codice, è una buona idea assicurarsi che Dispose non Dispose mai un'eccezione quando si implementa IDisposable . Altrimenti un'eccezione effettiva verrebbe sovrascritta dalla nuova eccezione che risulterebbe in un incubo di debug.

Ritornando dall'utilizzo del blocco

using ( var disposable = new DisposableItem() )
{
    return disposable.SomeProperty;
}

A causa delle semantica di try..finally cui il using blocco traduce, il return economico funziona come previsto - il valore di ritorno viene valutata prima finally viene eseguito blocco e il valore disposto. L'ordine di valutazione è il seguente:

  1. Valuta il corpo del try
  2. Valuta e memorizza il valore restituito
  3. Esegui infine il blocco
  4. Restituisce il valore di ritorno memorizzato nella cache

Tuttavia, non è possibile restituire la variabile disposable e disposable stessa, poiché essa conterrebbe un riferimento disposto non valido - vedere l' esempio correlato .