我是C#学习的初学者。
我意识到using
与C#中的import
类似
但是在这种情况下我遇到过:
using (con)
{
con.Open();
cmd.ExecuteNonQuery();
}
只是好奇这里使用的是什么,没有using (con)
答案 0 :(得分:11)
这种形式的using
(statement,而不是directive)与IDisposable
界面一起使用,以回收非托管资源。
非托管资源就像数据库连接一样,垃圾收集器无法简单地回收它们。相反,它们需要以有序的方式关闭。当using
代码块超出范围时,将在数据库连接对象上调用Dispose()
方法,关闭连接并释放资源。
例如,查看SQLConnection课程。请注意,它继承自DBConnection类,后者又实现IDisposable
接口。 SQLConnection对象implements the Dispose method,当范围离开using
块时关闭连接。
请注意,您可以abuse the using
statement和IDisposable
获取乐趣和利润。 ASP.NET MVC使用using
来关闭HTML标记!
答案 1 :(得分: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();
}
答案 2 :(得分:3)
根据MSDN
C#通过.NET Framework公共语言运行库(CLR)自动释放用于存储不再需要的对象的内存。记忆的释放是不确定的;只要CLR决定执行垃圾收集,就会释放内存。但是,通常最好尽快释放有限的资源,如文件句柄和网络连接。
using语句允许程序员指定何时使用资源的对象应该释放它们。提供给using语句的对象必须实现IDisposable接口。此接口提供Dispose方法,该方法应释放对象的资源。
当达到using语句的结尾或者抛出异常并且控制在语句结束之前离开语句块时,可以退出using语句。
using语句强制清理资源,而开发人员不必明确处理它们或等待垃圾收集器回收资源。
答案 3 :(得分: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#中的using
语句相当于VB.NET中的Imports
语句。