5

我是 C# 学习的初学者。

我意识到这using就像import在 C#

但是后来我遇到了这种情况:

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

只是好奇这在这里使用做什么,没有什么有什么不同using (con)

4

4 回答 4

11

这种形式的using语句,而不是指令)与IDisposable接口一起使用,以回收非托管资源。

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

例如,查看SQLConnection类。请注意,它继承自DBConnection类,而后者又实现了IDisposable接口。SQLConnection 对象实现 Dispose 方法using,该方法在作用域离开块时关闭连接。

请注意,您可以滥用该using声明IDisposable获取乐趣和利润。ASP.NET MVC 用于using关闭 HTML 标记!

于 2013-07-30T02:45:38.163 回答
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();
}
于 2013-07-30T02:46:11.543 回答
3

根据MSDN

C# 通过 .NET Framework 公共语言运行时 (CLR) 自动释放用于存储不再需要的对象的内存。内存的释放是不确定的;每当 CLR 决定执行垃圾回收时,就会释放内存。但是,通常最好尽快释放文件句柄和网络连接等有限资源。

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

当到达 using 语句的末尾或抛出异常并且控制在语句结束之前离开语句块时,可以退出 using 语句。

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

于 2013-07-30T02:48:40.090 回答
3

using块可以应用于任何实现该IDisposable接口的 .NET 对象。如果您尝试将块应用于不适用的对象,则会收到编译错误。

using块实际上会在try-finally块内的代码周围生成一个using块。

以下:

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

相当于写:

try
{
    con.Open();
    cmd.ExecuteNonQuery();
}
finally
{
    con.Close();
    con.Dispose();
}

using块辅助是一种生产力增强,可确保正确清理一次性对象,并且在我看来,创建更易于阅读和维护的代码。

注意:您可以嵌套using块,如下所示:

using(con)
using(cmd)
{

}

C# 中的语句与 VB.NET中的语句using等效。Imports

于 2013-07-30T02:54:46.770 回答