这是我过去多次问自己的一个问题,因为我使用语句5深度嵌套。
阅读docs并且没有提及关于在块中实例化的其他一次性用品的方式,我认为它对于SO档案来说是一个很好的Q.
考虑一下:
using (var conn = new SqlConnection())
{
var conn2 = new SqlConnection();
}
// is conn2 disposed?
答案 0 :(得分:14)
不,他们不是。只会自动处理using子句中明确列出的变量集。
答案 1 :(得分:6)
显然我有答案......; - )
答案是否定的。只处理使用声明中的对象
[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
}
答案 2 :(得分:4)
如果您想要使用using语句的确切规则,请参阅规范的第8.13节。你的所有问题都应该在那里清楚地回答。
答案 3 :(得分:2)
不,它不起作用,conn2
将不会被处理。
请注意,倍数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
并不是什么大问题。
答案 4 :(得分:1)
没有。使用会导致处理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...
}
答案 5 :(得分:0)
没有。使用ILDASM或Reflector检查生成的IL。
答案 6 :(得分:0)
只会处理using()
中的变量,而不是实际的代码块。