C#基础知识:关于"using"关键字

5

我是一个C#的初学者。

我意识到,在C#中using就像Python中的 import 语句。

但是,我遇到了这种情况:

using (con)
{
    con.Open();
    cmd.ExecuteNonQuery();
}

我很好奇这里使用的 using 是做什么用的,和没有 using (con) 有什么不同。

4个回答

11
This form of using (the statement, not the directive) works with the IDisposable interface, to reclaim unmanaged resources.

非托管资源是指像数据库连接这样的资源,不能简单地由垃圾回收器回收。相反,它们需要以有序的方式关闭。当using代码块超出范围时,将在数据库连接对象上调用Dispose()方法,关闭连接并释放资源。

作为一个例子,看看SQLConnection类。请注意,它继承自DBConnection类,后者实现了IDisposable接口。SQLConnection对象实现了Dispose方法,当作用域离开using块时关闭连接。
请注意,您可以滥用using语句IDisposable来获得乐趣和利润。ASP.NET MVC使用using来关闭HTML标记!

5

using语句将在代码块结束时调用Dispose方法。对象必须实现IDisposable接口才能使其起作用。这个语句的原理是因为你的con对象实现了IDisposable接口,而且在该方法之后它将变成null。我喜欢在声明对象时实现using代码块,例如:

using (var con = new SqlConnection("connection string"))
{
    con.Open();

    using(var cmd = con.CreateCommand()) 
    {
       cmd.CommandText = "select count(*) from table";
       result = (int) cmd.ExecuteScalar();
    }

    con.Close();
}

3
using块可以应用于实现IDisposable接口的任何.NET对象。如果您尝试针对不实现该接口的对象应用该块,则会收到编译错误。 using块将在using块内的代码周围生成一个try-finally块。
以下内容:
using (con)
{
    con.Open();
    cmd.ExecuteNonQuery();
}

等同于编写:

try
{
    con.Open();
    cmd.ExecuteNonQuery();
}
finally
{
    con.Close();
    con.Dispose();
}
using块是一种提高生产力的辅助工具,可以确保一次性对象被正确清理,并且在我看来,可以创建更易于阅读和维护的代码。
注意:您可以像这样嵌套using块:
using(con)
using(cmd)
{

}

在C#中,using语句相当于VB.NET中的Imports语句。

不确定您是否称其为“嵌套”,它更像是下一行不需要括号,就像if语句一样,它仅适用于下一行代码。 - Phill

3
根据MSDN,通过.NET Framework公共语言运行时(CLR),C#自动释放不再需要的对象的存储内存。内存的释放是非确定性的;CLR决定执行垃圾回收时会释放内存。然而,最好尽快释放有限的资源,例如文件句柄和网络连接。

using语句允许程序员指定使用资源的对象应在何时释放它们。提供给using语句的对象必须实现IDisposable接口。该接口提供Dispose方法,应释放对象的资源。

当到达using语句的结尾或在语句块结束之前控制离开语句块时抛出异常,都会导致退出using语句。

using语句强制清理资源,而无需开发人员显式地处理它们或等待垃圾回收器回收资源。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接