这是我第一次使用嵌套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
和良好实践。
你甚至可以删除第一次使用块的curley大括号,如下所示:
using (SqlConnection cnn = new SqlConnection(_ConnectionString))
using (SqlCommand cmd = new SqlCommand())
{
}
答案 1 :(得分:2)
使用块“保证资源的处理......即使在未处理的异常情况下也是如此。”
用一粒盐来保证“保证”。许多事情可以阻止资源的处置。如果using块包含无限循环怎么办?或者块抛出异常,堆栈上较高的恶意异常过滤器进入无限循环并且永远不会将控制返回到与using语句关联的finally块?或者块调用Environment.FailFast?有许多东西可以阻止处理的进行。永远不要编写依赖于处置的程序,以确保其正确性。处置是为了礼貌,将稀缺资源返回池中以供其他人使用。
此外,让我确保这一点很明确:真正未处理的异常是C#中实现定义的行为。 using block的finally子句用于处理在using块中抛出异常然后在其他地方处理的情况,而不是处理在块内抛出异常并且从不处理的情况。如果发生这种情况,那么完全取决于实施以确定会发生什么; C#语言对抛出永远不会处理的异常的程序的行为总共做出了零承诺。资源可能会被处置。他们可能不会。你在一座即将被拆除的建筑物里;你真的想花点时间洗碗并把它们整齐地拿走吗?
多个嵌套的使用块有什么好处吗?
是
单个Using块是否已经保证它所包含的所有资源都将被处理?
没有。仅清除using语句实际提到的资源。这就是你筑巢的原因。
在某些情况下,技术上你没有必要,因为内部人员负责释放与外部资源相同的资源。但是使用块来嵌套并不会造成任何伤害,这使读者清楚地知道发生了什么。这里的最佳实践是为每个要清理的资源使用一个using语句。