In C # wird die usingAnweisung verwendet, um die Ressourcen deterministisch zu entsorgen, ohne auf den Garbage Collector zu warten. Zum Beispiel kann es verwendet werden, um:
Entsorgen Sie SQL-Befehle oder -Verbindungen.
Schließen Sie Streams und geben Sie die zugrunde liegende Quelle wie eine Datei frei.
Kostenlose GDI + Elemente,
etc.
Mir ist aufgefallen, dass dies usingimmer häufiger in Fällen verwendet wird, in denen nichts zu entsorgen ist, der Anrufer jedoch nur bequemer einen usingBlock als zwei separate Befehle schreiben kann .
Beispiele:
MiniProfiler , geschrieben vom Stack Overflow-Team,
usingbezeichnet Blöcke im Profil:using (profiler.Step("Name goes here")) { this.DoSomethingUseful(i - 1); }Ein alternativer Ansatz wäre, zwei Blöcke zu haben:
var p = profiler.Start("Name goes here"); this.DoSomethingUseful(i - 1); profiler.Stop(p);Ein anderer Ansatz wäre die Verwendung von Aktionen:
profiler.Step("Name goes here", () => this.DoSomethingUseful(i - 1));ASP.NET MVC hat auch folgende
usingFormulare ausgewählt:<% using (Html.BeginForm()) { %> <label for="firstName">Name:</label> <%= Html.TextBox("name")%> <input type="submit" value="Save" /> <% } %>
Ist eine solche Verwendung angemessen? Wie kann man das rechtfertigen, da es mehrere Nachteile gibt:
Anfänger wären verloren, da eine solche Verwendung nicht der entspricht, die in Büchern und Sprachspezifikationen erklärt wird.
Der Code sollte ausdrucksstark sein. Hier leidet die Ausdruckskraft, da die angemessene Verwendung von darin
usingbesteht, zu zeigen, dass sich dahinter eine Ressource wie ein Stream, eine Netzwerkverbindung oder eine Datenbank befindet, die freigegeben werden sollte, ohne auf den Garbage Collector zu warten.
using: Die letztere Anweisung (z. B.profiler.Stop(p)) kann angesichts von Ausnahmen und Kontrollabläufen nicht garantiert ausgeführt werden.