C# 可能错误的空语句

标签 c#

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

相关文章:

c# - 如何创建和应用密文?

c# - 为什么要在调用事件调用之前定义对事件的引用?

c# - 将我的 List<Roomtype> 转换为 SelectList for ASP。 NET MVC DropDownFor<>,并为每个选项项获取正确的值

c# - 如何模拟 SerialDataReceivedEventArgs

c# - System.IO.File 类的 WriteAllTextAsync 方法不输出大于 4kb 的文本

c# - 如何在 WinForm 中使用自定义构造函数?

c# - LINQ 左连接和右连接

c# - 使用 Azure WebJobs SDK 进行依赖注入(inject)?

c# - 将值数组四舍五入为 100%

c# - 在不重新编译整个应用程序的情况下升级依赖的 DLL