In C #, l' using
istruzione 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 using
viene utilizzato sempre di più nei casi in cui non c'è nulla da smaltire, ma dove è più conveniente per il chiamante scrivere un using
blocco anziché due comandi separati.
Esempi:
MiniProfiler , scritto dal team Stack Overflow, utilizza
using
per 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
using
moduli:<% 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.