我已经看到在代码块中间使用的using语句是什么原因?
答案 0 :(得分:41)
使用语法可以(应该)用作为实现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方法,该方法应释放对象的资源。
答案 1 :(得分:3)
打开与流或数据库的连接时经常使用它。
它的行为类似于try {...} finally {...}块。在使用块之后,在括号中实例化的IDisposable对象将被正确关闭。
using (Stream stream = new Stream(...))
{
}
使用此示例,在块之后正确关闭流。
答案 2 :(得分:3)
使用是最后尝试语法suger任何具有IDisposable的东西..像sqlconnection。它的用途是确保在using(){}
范围之后处理某些东西。
using(SqlConnection conn = new SqlConnection(connString))
{
//use connection
}
//shorter than
SqlConnection conn = new SqlConnection(connString)
try
{
//use connection
}
finally
{
conn.Dispose();
}
答案 3 :(得分:2)
using语句确保一旦不再需要对象就可以正确处理。 它基本上可以节省你写obj.Dispose();并提供有关变量范围和用法的可视指南。
有关详细信息,请参阅the MSDN page
答案 4 :(得分:2)
这种使用形式与释放资源有关。它只能与实现IDisposable接口的类结合使用。
示例:
using(SqlConnection conn = new SqlConnection(someConnectionString))
{
//Do some database stuff here
}
在使用块conn的末尾。即使在块内抛出异常,也会调用Dispose。对于SwqlConnection对象,意味着连接始终处于关闭状态。
这种结构的一个缺点是现在有了解发生了什么的方法。
希望这有助于回答您的问题?
答案 5 :(得分:2)
每当您的代码创建一个实现IDisposable的对象时,您的代码应该在using块中进行创建,如上所示。
此规则有一个例外。 WCF代理类设计中的错误会阻止使用语句对代理类有用。简而言之,代理类上的Dispose方法可能会抛出异常。 WCF团队没有理由不允许这样做。
不幸的是,没有理由并不意味着 没有理由:
try
{
using (var svc = new ServiceReference.ServiceName())
{
throw new Exception("Testing");
}
}
catch (Exception ex)
{
// What exception is caught here?
}
如果隐式Dispose调用抛出异常,那么catch块将捕获该异常,而不是使用块中抛出的异常。