【问题标题】:Should empty "if" statement in C# lead to an error or warning?C# 中的空“if”语句是否会导致错误或警告?
【发布时间】:2010-08-23 04:34:47
【问题描述】:

让我从一个现实生活中的例子开始:

客户: Alex,刚刚注意到第 138 行的 RemovalProcessor 中有一些奇怪的东西:

if (Session.Handler.ExecutePrefetchTasks()==null); 
  Session.ExecuteDelayedQueries(); 

'if' 后面的分列应该在那里吗?

我: 哎呀...我会把这个发给我们的人检查,但很可能,你是对的。

虽然这种情况很少见,但我承认几乎所有大项目都有类似的问题。

我了解 C# 中的分号(和语句块)使用规则无法更改(我个人更喜欢 Python 风格)。但我认为用if 语句识别正是这种情况 是个好主意,并将其归类为错误或警告。

我想到的几个问答:

  • 为什么在这种情况下会产生警告或错误?

    因为这可能是 99% 的概率是开发人员的错误。

  • 为什么在这种情况下错误更可取?

    在许多情况下,开发人员会忽略警告。

    我明白这是他们自己的问题,还有 /warnaserror (威胁警告为错误)切换,但因为这是一个错误 很有可能,而且,如果它不是错误(真的吗?;)), 解决这个问题很容易,可能最好对这种情况进行分类 作为一个错误。

    最后,这种情况下的错误不会“限制”开发人员, 因为这样的代码可以(并且可能,必须)总是被重写 没有if 声明。

  • 为什么在这种情况下最好使用警告?

    这不会破坏兼容性;我也怀疑一些代码生成器 可能会根据当前行为生成代码。

所以我很高兴听到您对此的意见。

【问题讨论】:

  • Resharper 会给你一个警告 :-)

标签: c# .net c#-3.0 c#-4.0 c#-2.0


【解决方案1】:

它已经产生了警告:

Possible mistaken empty statement

我同意你的观点,错误会更可取(如果你真的想要一个空语句,总是可以写成{ },这样更明确)——但他们不会改变 C# 语言方式。这将是一个突破性的变化,我怀疑他们(阅读:Eric Lippert 的)的理由是“收益不会超过成本”。

【讨论】:

  • 太棒了——我似乎也没有注意到这一点。
  • 关于 Eric Lippert 的辩护 - 可能。但是在发现(在这里)我自己(以及至少还有几个开发人员@我们的团队)错过了这个警告之后,我也会投票赞成错误。
  • @Alex:这是否表明你的项目有太多警告,所以大家都忽略了?也许您应该考虑修复代码,使其不再有警告和/或在您认为代码正常并且应该消除警告的地方使用#pragma warning disable。然后你就可以重新开始关注警告了。
  • @Timwi:不,实际上,每个项目只有几个。但由于大多数未修复的警告并不是很重要,所以现在我们似乎很少查找它们。
  • 你们知道可以打开“所有警告都是错误”,开关吧?
【解决方案2】:

此示例与您的示例类似,不应产生编译错误,因为它的目的是有条件地执行逻辑。

if ( DoSomething() || SolveEquation() ) ;  // Intentional - compiles and  runs as expected.

如果if 关键字被删除,你会得到一个编译错误。

DoSomething() || SolveEquation();  // Compile ERROR.

Short circuit logic of C# 确定:如果 DoSomething() 返回 true,则 SolveEquation() 不计算;否则将被评估。

我们假设这两个函数都会以某种方式改变正在运行的程序的状态,因此执行哪个函数很重要——因为这将决定一种特定的程序状态。当然更好的写法是……

if ( ! DoSomething() )
    SolveEquation();

或者(感谢 Alex 来自 cmets 的这篇文章)

bool result = DoSomething() || SolveEquation(); 

.. 但是为什么要抢第一种方式的用户呢?

因为第一种方式可以说是错误的形式,但它证明你不一定希望这种情况产生编译错误。

这是我的论点,它不应该产生编译错误。现有的警告很好,以防开发人员犯了一个常见的错误。

【讨论】:

  • 恕我直言,在这种情况下最好使用bool result = DoSomething() || SolveEquation();
  • 嘿@Alex 谢谢你。用信用将它添加到答案中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多