В C # usingоператор используется для детерминированного размещения ресурсов без ожидания сборщика мусора. Например, он может быть использован для:
Утилизируйте команды или соединения SQL,
Закрывайте потоки, освобождая основной источник как файл,
Бесплатные элементы GDI +,
и т.п.
Я заметил, что usingэто все больше и больше используется в тех случаях, когда нечего распоряжаться, но когда вызывающей стороне просто удобнее написать usingблок, а не две отдельные команды.
Примеры:
MiniProfiler , написанный командой Stack Overflow, использует
usingдля обозначения блоков в профиле:using (profiler.Step("Name goes here")) { this.DoSomethingUseful(i - 1); }Одним из альтернативных подходов было бы иметь два блока:
var p = profiler.Start("Name goes here"); this.DoSomethingUseful(i - 1); profiler.Stop(p);Другой подход заключается в использовании действий:
profiler.Step("Name goes here", () => this.DoSomethingUseful(i - 1));ASP.NET MVC также выбран
usingдля форм:<% using (Html.BeginForm()) { %> <label for="firstName">Name:</label> <%= Html.TextBox("name")%> <input type="submit" value="Save" /> <% } %>
Такое использование уместно? Как это оправдать, учитывая, что есть несколько недостатков:
Начинающие будут потеряны, так как такое использование не соответствует тому, которое объясняется в книгах и спецификации языка,
Код должен быть выразительным. Здесь страдает выразительность, поскольку надлежащее использование
usingсостоит в том, чтобы показать, что позади есть ресурс, такой как поток, сетевое соединение или база данных, который должен быть освобожден без ожидания сборщика мусора.
using: последнее (напримерprofiler.Stop(p)) утверждение не гарантируется для выполнения в условиях исключений и потока управления.