在c#中使用using语句

可能重复:
什么是C#Using块,我为什么要使用它?

我已经看到在代码块中间使用的using语句是什么原因造成的?

使用语法可以(应该)用于为实现IDisposable的任何内容定义范围。 using语句确保在发生exception时调用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(); } 

从MSDN额外阅读

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

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

它通常在打开与流或数据库的连接时使用。

它表现得像try {…} finally {…}块。 在使用块之后,将在括号中实例化的IDisposable对象将被正确关闭。

 using (Stream stream = new Stream(...)) { } 

在此示例中,流在块之后正确关闭。

使用是最后尝试语法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(); } 

using语句确保一旦不再需要对象就可以正确处理。 它基本上可以节省你写obj.Dispose(); 并提供有关变量范围和用法的可视指南。

有关详细信息,请参阅MSDN页面

这种使用forms与释放资源有关。 它只能与实现IDisposable接口的类结合使用。

例:

 using(SqlConnection conn = new SqlConnection(someConnectionString)) { //Do some database stuff here } 

在using块的末尾conn.Dispose被调用,即使在块内抛出exception。 对于SwqlConnection对象,意味着连接始终是关闭的。

这种结构的缺点是现在有了解发生了什么的方法。

希望这有助于回答您的问题?

每当您的代码创建一个实现IDisposable的对象时,您的代码应该在using块中进行创建,如上所示。

这条规则有一个例外。 WCF代理类设计中的错误会阻止使用语句对代理类有用。 简而言之,代理类上的Dispose方法可能会抛出exception。 WCF团队没有理由不允许这样做。

不幸的是,没有理由并不意味着没有理由:

 try { using (var svc = new ServiceReference.ServiceName()) { throw new Exception("Testing"); } } catch (Exception ex) { // What exception is caught here? } 

如果隐式Dispose调用抛出exception,那么catch块将捕获exception而不是using块中抛出的exception。