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