是的,当然。详细信息在第 8.13 节中。您的确切问题没有简明扼要的陈述,但是:
形式的 using 语句
using (expression) statement
具有相同的三种可能的扩展,但在这种情况下,ResourceType 隐含地是表达式的编译时类型,资源变量在嵌入语句中是不可访问的,也不可见。
提到的“三种可能的扩展”涵盖了同时声明变量的更常见情况。基本上重要的是它的行为方式相同,除了变量的范围。 Dispose 仍将被调用 - 否则根本没有必要添加 using 语句:)
请注意,就块内的有效内容而言,两者相当等效,因为using 语句声明的变量是只读的。所以这是有效的:
// Warning but no error
MemoryStream ms = new MemoryStream();
using (ms)
{
ms = null;
}
但这不是:
using (MemoryStream ms = new MemoryStream())
{
// error CS1656: Cannot assign to 'ms' because it is a 'using variable'
ms = null;
}
请注意,即使在有效的情况下,它也是用于处置的ms 的原始 值。编译器清楚地表明了这一点:
警告 CS0728:可能不正确地分配给本地“ms”,这是 using 或 lock 语句的参数。 Dispose 调用或解锁将发生在本地的原始值上。
请注意,此表单不会生成警告:
// No warning
MemoryStream ms;
using (ms = new MemoryStream())
{
ms = null;
}
另一方面,除此之外,它们的行为方式确实相同。
编辑:正如 bzlm 所指出的,变量在 using 语句之后仍然在范围内这一事实意味着它通常不是一个好主意。但是,已处置的对象并非总是不可用。例如:
MemoryStream ms = new MemoryStream();
using (ms)
{
// Do stuff
}
byte[] data = ms.ToArray();
这样就可以了——MemoryStream 会保留数据,即使数据已被处理。不过我还是觉得有点不对劲。