在 C# 中,我可以这样写:
using (new MyDisposableClass().MethodA());
分号会导致显示编译器警告,指出可能存在错误的空语句。我没有运行上面的代码,但是方法不会被调用吗?
这种编码约定有什么用?我在这里看到了另一个线程,但我问是否现在有任何差异/因此有不同的回复。
谢谢
最佳答案
这段代码基本上转化为
MyDisposableClass tmp = new MyDisposableClass().MethodA();
try
{
}
finally
{
if( tmp != null )
tmp.Dispose();
}
基本上,您要处理对 MethodA
的调用结果,而不是处理 MyDisposableClass
,这可能是意图。
using 语句后的 ;
是合法的,但警告表明您可能错误地将其添加到那里。例如,以下代码将无法编译:
using( var tmp = new MyDisposableClass() );
{
tmp.MethodA();
}
解析器评估两个完全独立的 block ,编译器认为您输入了以下内容:
using( var tmp = new MyDispoableClass() )
{
}
{
tmp.MethodA();
}
眼睛很容易错过悬垂的 ;
,因此编译器警告只是暗示您可能打算做其他事情。有时需要更短的简洁语句,我认为表明它是有目的的最好方法是使用 {}
而不是 ;
。
using( new MyDisposableClass().MethodA() ){}
仍请注意,这是处理调用 MethodA 的结果 - 而不是 MyDisposableClass 实例。你的代码实际上应该写成
using( var tmp = new MyDisposableClass() ){ tmp.MethodA(); }
关于C# 可能错误的空语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2869821/