可能重复:
什么是 C# Using 块,我为什么要使用它?
我已经看到在代码块中间使用了 using 语句,这是什么原因?
using语法可以(应该)用作定义任何实现IDisposable的范围的方法。using 语句确保在发生异常时调用 Dispose。
//the compiler will create a local variable
//which will go out of scope outside this context
using (FileStream fs = new FileStream(file, FileMode.Open))
{
//do stuff
}
或者,您可以只使用:
FileStream fs;
try{
fs = new FileStream();
//do Stuff
}
finally{
if(fs!=null)
fs.Dispose();
}
C# 通过 .NET Framework 公共语言运行时 (CLR) 自动释放用于存储不再需要的对象的内存。内存的释放是不确定的;每当 CLR 决定执行垃圾回收时,就会释放内存。但是,通常最好尽快释放文件句柄和网络连接等有限资源。
using 语句允许程序员指定使用资源的对象何时应该释放它们。提供给 using 语句的对象必须实现 IDisposable 接口。该接口提供了 Dispose 方法,该方法应该释放对象的资源。
它通常在打开到流或数据库的连接时使用。
它的行为类似于 try { ... } finally { ... } 块。在using块之后,括号中实例化的 IDisposable 对象将被正确关闭。
using (Stream stream = new Stream(...))
{
}
在此示例中,流在块之后正确关闭。
使用最终尝试语法糖用于任何具有 IDisposable.. 的东西,比如 sqlconnection。它的使用确保某些东西在超出using(){}
范围后被处置。
using(SqlConnection conn = new SqlConnection(connString))
{
//use connection
}
//shorter than
SqlConnection conn = new SqlConnection(connString)
try
{
//use connection
}
finally
{
conn.Dispose();
}
using 语句确保对象在不再需要时被正确处理。它基本上可以节省您编写 obj.Dispose(); 并提供关于变量范围和使用的可视化指南。
有关详细信息,请参阅MSDN 页面
这种使用形式与释放资源有关。它只能与实现 IDisposable 接口的类结合使用。
例子:
using(SqlConnection conn = new SqlConnection(someConnectionString))
{
//Do some database stuff here
}
在 using 块结束时调用 conn.Dispose,即使在块内引发异常也是如此。在 SwqlConnection 对象的情况下意味着连接总是关闭的。
这种结构的一个缺点是现在有办法知道发生了什么。
希望这有助于回答您的问题?
每当您的代码创建一个实现 IDisposable 的对象时,您的代码都应该在 using 块内进行创建,如上所示。
这条规则有一个例外。WCF 代理类设计中的一个错误会阻止 using 语句对代理类有用。简而言之,代理类的 Dispose 方法可能会引发异常。WCF 团队认为没有理由不允许这样做。
不幸的是,没有看到原因并不意味着没有原因:
try
{
using (var svc = new ServiceReference.ServiceName())
{
throw new Exception("Testing");
}
}
catch (Exception ex)
{
// What exception is caught here?
}
如果隐式 Dispose 调用引发异常,则 catch 块将捕获该异常,而不是在using块中引发的异常。