这是我过去经常问自己的问题,当我嵌套使用五层语句时。阅读文档,发现关于块内实例化的其他可处理对象的提及方式并没有明确说明,因此我认为将其记录在Stack Overflow归档中是一个好的问题。
考虑以下内容:
using (var conn = new SqlConnection())
{
var conn2 = new SqlConnection();
}
// is conn2 disposed?
这是我过去经常问自己的问题,当我嵌套使用五层语句时。阅读文档,发现关于块内实例化的其他可处理对象的提及方式并没有明确说明,因此我认为将其记录在Stack Overflow归档中是一个好的问题。
考虑以下内容:
using (var conn = new SqlConnection())
{
var conn2 = new SqlConnection();
}
// is conn2 disposed?
不是所有的变量都会自动被处理。只有在`using`子句中明确列出的变量集才会被自动清理。
[Test]
public void TestUsing()
{
bool innerDisposed = false;
using (var conn = new SqlConnection())
{
var conn2 = new SqlConnection();
conn2.Disposed += (sender, e) => { innerDisposed = true; };
}
Assert.False(innerDisposed); // not disposed
}
[Test]
public void TestUsing2()
{
bool innerDisposed = false;
using (SqlConnection conn = new SqlConnection(), conn2 = new SqlConnection())
{
conn2.Disposed += (sender, e) => { innerDisposed = true; };
}
Assert.True(innerDisposed); // disposed, of course
}
SqlConnection.Dispose()
会在conn2
变量超出范围并且您的Assert
行之间由Component.Finalizer()
调用。这里存在竞争条件,不是吗? - binkiconn2
不会被处理。请注意,多个using
是唯一允许不使用括号以提高可读性的情况: using (var pen = new Pen(color, 1))
using (var brush = new SolidBrush(color))
using (var fontM60 = new Font("Arial", 15F, FontStyle.Bold, GraphicsUnit.Pixel))
using (var fontM30 = new Font("Arial", 12F, FontStyle.Bold, GraphicsUnit.Pixel))
using (var fontM15 = new Font("Arial", 12F, FontStyle.Regular, GraphicsUnit.Pixel))
using (var fontM05 = new Font("Arial", 10F, FontStyle.Regular, GraphicsUnit.Pixel))
using (var fontM01 = new Font("Arial", 8F, FontStyle.Regular, GraphicsUnit.Pixel))
using (var stringFormat = new StringFormat())
{
}
这种方式,嵌套的using
不是什么大问题。
不行。使用 using 语句会导致其中的对象被处理。如果你想让这两个对象都被处理,你应该将代码重写为:
using (var conn = new SqlConnection())
{
using (var conn2 = new SqlConnection())
{
// use both connections here...
}
}
或者,你也可以使用更简洁的语法:
using (SqlConnection conn = new SqlConnection(), conn2 = new SqlConnection())
{
// use both connections here...
}
using
语句而不是块 (using(var conn=new SqlConnection())using(var conn2=new SqlConnection()){ ... }
) 将被很好地对齐。它不会缩进第二个 using
。 - Jeffrey L Whitledgeusing()
内部声明的变量会被处理,而不是实际的代码块。