在C#中,using
语句用于确定性地配置资源,而无需等待垃圾回收器。例如,它可以用于:
处置SQL命令或连接,
关闭流,释放基础源,例如文件,
免费的GDI +元素,
等等
我注意到,using
在没有什么要处理的情况下,这种用法越来越多,但是对于调用者来说,编写一个using
块而不是两个单独的命令更方便。
例子:
由Stack Overflow团队编写的MiniProfiler
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)
不能保证后一个语句(例如)在遇到异常和控制流时执行。