2014-02-19 35 views
3

这是我第一次使用嵌套using。我做对了吗? 下面是代码:嵌套使用一个好主意

public Boolean AddToDigitalAssets(string fileName) 
{ 
    ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["Connection"].ConnectionString; 
    Boolean result = true; 
    using (SqlConnection cnn = new SqlConnection(_ConnectionString)) 
    { 
     using (SqlCommand cmd = new SqlCommand()) 
     { 
      using (SqlDataAdapter da = new SqlDataAdapter(cmd)) 
      { 

      } 
     } 
    } 
    return result; 
} 
+0

是的,没有错。效果很好。 –

回答

4

是的,它是完全Valid和良好做法。

,你甚至可以删除柯利括号为首先使用块如下:

using (SqlConnection cnn = new SqlConnection(_ConnectionString))    
using (SqlCommand cmd = new SqlCommand()) 
{ 

} 
2

using块“保处置资源的...即使在未处理的异常的情况下。”

用一粒盐来“保证”。许多事情可以阻止资源的处置。如果使用块包含无限循环会怎么样?或者块抛出一个异常,堆栈上的恶意异常过滤器进入无限循环,并且永远不会将控制权返回给与using语句关联的finally块?或者块调用Environment.FailFast?有很多很多事情可以阻止垃圾的运转。切勿编写依赖处置的程序来保证其正确性。处置是为了礼貌,为了让其他人使用它们而返回稀缺资源。此外,让我确定这一点是明确的:真正未处理的异常是C#中的实现定义的行为。使用块的finally子句用于处理在使用块内抛出异常然后在其他位置处理异常的情况,而不是处理在块内抛出异常并且从不处理的情况。如果发生这种情况,那么完全取决于实施来确定发生了什么; C#语言对引发永远不会处理的异常的程序的行为总是做出零承诺。资源可能会被处置。他们可能不会。你正在一栋即将被意外拆除的建筑物中;你真的想花时间洗碗,并整齐地把它们放在一边吗?

对多个嵌套使用块有没有好处?

是的。

单个使用块是否已经保证它所包含的所有资源都将被丢弃?

不。只有使用语句实际提到的资源才会被清理。这就是为什么你要嵌套它们。

在技术上有几种情况您不必因为内部人员负责释放与外部资源相同的资源。但是它不会损害任何使用块嵌套的东西,并且它使得读者很清楚发生了什么。这里的最佳实践是为每个需要清理的资源使用一个使用语句。

相关问题