C#可能错误的空语句

Gur*_*epS 4 c#

在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)

  • @Daniel - 它不一定是MyDisposableClass - 只是IDisposable. (2认同)