In C #, l'istruzione using
viene utilizzata per disporre in modo deterministico le risorse senza attendere il garbage collector. Ad esempio, può essere usato per:
-
Elimina comandi o connessioni SQL,
-
Chiudi stream, liberando l'origine sottostante come un file,
-
Elementi GDI + gratuiti,
-
ecc.
Ho notato che using
viene utilizzato sempre di più nei casi in cui non c'è nulla da smaltire, ma dove è più conveniente per il chiamante scrivere un blocco using
anziché due comandi separati.
Esempi:
-
MiniProfiler , scritto dal team Stack Overflow, utilizza
using
per indicare i blocchi del profilo:using (profiler.Step("Name goes here")) { this.DoSomethingUseful(i - 1); }
Un approccio alternativo sarebbe avere due blocchi:
var p = profiler.Start("Name goes here"); this.DoSomethingUseful(i - 1); profiler.Stop(p);
Un altro approccio sarebbe utilizzare le azioni:
profiler.Step("Name goes here", () => this.DoSomethingUseful(i - 1));
-
ASP.NET MVC ha anche selezionato
using
per i moduli:<% using (Html.BeginForm()) { %> <label for="firstName">Name:</label> <%= Html.TextBox("name")%> <input type="submit" value="Save" /> <% } %>
Tale uso è appropriato? Come giustificarlo, dato che ci sono diversi svantaggi:
-
I principianti sarebbero persi, poiché tale uso non corrisponde a quello spiegato nei libri e nelle specifiche del linguaggio,
-
Il codice dovrebbe essere espressivo. Qui, l'espressività soffre, poiché l'uso appropriato di
using
è mostrare che dietro c'è una risorsa, come un flusso, una connessione di rete o un database che dovrebbe essere rilasciato senza attendere il garbage collector.