该using
语句的重点是调用接口Dispose
中指定的方法。IDisposable
是的,在实现接口时,方法需要是公共的,或者您需要使用显式接口实现:
// Via a public method
public class Foo : IDisposable
{
public void Dispose()
{
// Stuff
}
}
// Via explicit interface implementation
public class Bar : IDisposable
{
void IDisposable.Dispose()
{
// Stuff
}
}
这里没有什么特别的IDisposable
——它只是普通的接口实现。
但是,您不应该IDisposable
仅仅为了它而实施-想法是它应该为您清理-如果您没有要执行的清理,则也不需要该using
语句。
至于第二点:您根本不允许声明与仍在范围内的另一个局部变量同名的局部变量。阅读起来会非常混乱,因此被禁止。从 C# 规范的第 8.5.1 节:
在 local-variable-declaration 中声明的局部变量的范围是发生声明的块。在局部变量的局部变量声明符之前的文本位置引用局部变量是错误的。在局部变量的范围内,声明另一个同名的局部变量或常量是编译时错误。
请注意,您仍然可以在一种方法中使用相同的局部变量名称两次,前提是它们不能同时在范围内:
void M()
{
using (Stream x = ...)
{
}
using (Stream x = ...)
{
}
for (int x = 0; x < 10; x++)
{
}
// Block introduced just for scoping...
{
string x = "";
...
}
}