应该在C#中清空“if”语句导致错误或警告?

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

客户:Alex,刚刚在第138行的RemovalProcessor中发现了一些奇怪的事情:

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

那个’if’后面的半圆是否应该在那里?

我:哎呀……我会把它发给我们的家伙来检查,但最有可能的是,你是对的。

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

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

很少有Q / AI考虑到:

  • 为什么在这种情况下应该生成警告或错误?

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

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

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

    我明白这是他们自己的问题,并且有/ warnaserror(威胁警告为错误)切换,但由于这是一个非常高概率的错误,并且,如果它不是错误(真的?;)),它是相当的很容易解决这个问题,可能最好将此案例归类为错误。

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

  • 为什么警告在这种情况下更可取?

    这不会破坏兼容性; 我还怀疑一些代码生成器可能会依赖于当前行为生成代码。

所以我很高兴听到你对此的看法。

它已经产生了一个警告:

可能错误的空陈述

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

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

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

如果删除了if关键字,则会出现编译错误。

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

C#的短路逻辑确定:如果DoSomething()返回true则不评估SolveEquation(); 否则就会被评估。

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

 if ( ! DoSomething() ) SolveEquation(); 

或者(感谢Alex对此评论的评论)

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

..但为什么抢劫用户的第一种方式?

因为第一种方式可以被认为是不好的forms,但它certificate你不一定希望情况产生编译错误。

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