Em C #, a usinginstrução é usada para dispor de maneira determinística os recursos sem aguardar o coletor de lixo. Por exemplo, pode ser usado para:
Descarte comandos ou conexões SQL,
Feche os fluxos, liberando a fonte subjacente como um arquivo,
Elementos GDI + gratuitos,
etc.
Percebi que isso usingé usado cada vez mais nos casos em que não há nada a ser descartado, mas onde é mais conveniente para o chamador escrever um usingbloco em vez de dois comandos separados.
Exemplos:
O MiniProfiler , escrito pela equipe Stack Overflow, usa
usingpara indicar blocos no perfil:using (profiler.Step("Name goes here")) { this.DoSomethingUseful(i - 1); }Uma abordagem alternativa seria ter dois blocos:
var p = profiler.Start("Name goes here"); this.DoSomethingUseful(i - 1); profiler.Stop(p);Outra abordagem seria usar ações:
profiler.Step("Name goes here", () => this.DoSomethingUseful(i - 1));O ASP.NET MVC também selecionou os
usingformulários:<% using (Html.BeginForm()) { %> <label for="firstName">Name:</label> <%= Html.TextBox("name")%> <input type="submit" value="Save" /> <% } %>
Esse uso é apropriado? Como justificá-lo, uma vez que existem várias desvantagens:
Os iniciantes seriam perdidos, pois esse uso não corresponde ao explicado nos livros e nas especificações de idioma,
O código deve ser expressivo. Aqui, a expressividade sofre, pois o uso apropriado de
usingé mostrar que, por trás, existe um recurso, como um fluxo, uma conexão de rede ou um banco de dados que deve ser liberado sem aguardar o coletor de lixo.
using: A última instrução (por exemploprofiler.Stop(p)) não é garantida para ser executada diante de exceções e fluxo de controle.