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
usingper 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
usingper 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.