这是我过去多次问过自己的一个问题,因为我使用 5 深的语句进行嵌套。
阅读文档并发现没有提及关于块内实例化的其他一次性用品的任何一种方式,我认为这是 SO 档案的一个很好的 Q。
考虑一下:
using (var conn = new SqlConnection())
{
var conn2 = new SqlConnection();
}
// is conn2 disposed?
这是我过去多次问过自己的一个问题,因为我使用 5 深的语句进行嵌套。
阅读文档并发现没有提及关于块内实例化的其他一次性用品的任何一种方式,我认为这是 SO 档案的一个很好的 Q。
考虑一下:
using (var conn = new SqlConnection())
{
var conn2 = new SqlConnection();
}
// is conn2 disposed?
不,他们不是。只有在 using 子句中明确列出的变量集才会被自动处理。
显然我有答案...... ;-)
答案是不。只有 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
}
如果您想了解 using 语句的确切规则,请参阅规范的第 8.13 节。你所有的问题都应该在那里得到清楚的回答。
不,它不起作用,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
并不是什么大问题。
不会。 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...
}
否。使用 ILDASM 或 Reflector 检查生成的 IL。
只会处理 中的变量using()
,而不是实际的代码块。.