在C#中,我可以这样写:
using (new MyDisposableClass().MethodA());
Run Code Online (Sandbox Code Playgroud)
分号会显示编译器警告,指出可能出错的空语句.我没有运行上面的代码,但仍然不会调用该方法?
这种编码惯例有什么用途?我在这里看到了另一个关于此问题的线索,但我要求现在存在差异/因此有不同的回复.
谢谢
Pau*_*der 11
这段代码基本上转化为
MyDisposableClass tmp = new MyDisposableClass().MethodA();
try
{
}
finally
{
if( tmp != null )
tmp.Dispose();
}
Run Code Online (Sandbox Code Playgroud)
基本上你是在处理调用的结果MethodA
,而不是处理MyDisposableClass
可能的意图.
将;
以下using语句是合法的,但警告提示您可能已经由于失误,加入它.例如,以下代码将无法编译:
using( var tmp = new MyDisposableClass() );
{
tmp.MethodA();
}
Run Code Online (Sandbox Code Playgroud)
解析器评估两个完全独立的块,编译器可以看到它就像你键入了这个:
using( var tmp = new MyDispoableClass() )
{
}
{
tmp.MethodA();
}
Run Code Online (Sandbox Code Playgroud)
很容易错过一个悬空;
的眼睛所以编译器警告只是暗示你可能想要做其他事情.有时需要更简洁的陈述,我认为表明它是故意的最好的方法是使用{}
而不是a ;
.
using( new MyDisposableClass().MethodA() ){}
Run Code Online (Sandbox Code Playgroud)
还要注意,这是调用MethodA的调用结果 - 而不是MyDisposableClass实例.你的代码实际上应该写成
using( var tmp = new MyDisposableClass() ){ tmp.MethodA(); }
Run Code Online (Sandbox Code Playgroud)