为什么C#不接受布尔运算符作为当前运算符的单词(“and”,“或”,“not”,...等)?

时间:2010-09-04 13:48:51

标签: c# programming-languages readability

我的if stetement:

if (!string.IsNullOrEmpty(Person.Name))
        // some code

我认为“!”编写命令式代码时,运算符的可读性较差,

您是否同意我以下代码更具可读性?

if (not string.IsNullOrEmpty(Person.Name))
            // some code

我不是在谈论替换当前的运算符,但如果语言同时接受它们,问题出在哪里?

4 个答案:

答案 0 :(得分:11)

有几个很好的理由:

  • 有些细节表明这些词语传达得不好。例如,短路AND运算符与不短路的运算符(&& vs&)。 VB最近(ish)推出了一个名为AndAlso的短路AND运算符。这从来没有对我有任何意义。它似乎从一开始就混淆了人们。

  • 减少打字。布尔逻辑在任何地方都可以使用,每个表达式上保存的几个键击可以累积很多 - 或者至少,我发现必须输入更多内容非常烦人。

  • 因为它是C,Java,Objective-C和C ++程序员习惯的。人们现在已经使用这种语法40(?) - ish years。它为人们似乎喜欢的语言带来了连续性。

  • “和”,“或”,“和”不是英文单词,而是使用像这样的字形的语法!和&& /&更具语言和文化中立性。

  • 添加更多运算符意味着同样的事情对于语言的操作是不必要的,并且可能会令人困惑。

答案 1 :(得分:7)

如果您希望您的代码更具“可读性”,那么VB对您来说可能是更好的选择。拥有像

这样的陈述是完全有效的
If value Is Not Null Then
   'do something
End If

我个人觉得c#语法!和&&和||具有很强的可读性,因为它们在多种语言中是一致的,并且也倾向于遵循数学中使用的惯例,这些惯例通常来自这些操作。

这也意味着它们的含义没有歧义,因为它是一个符号。

答案 2 :(得分:1)

总之,问题在于复杂性。从可用性的角度来看,您不希望将开发人员混淆多种方式来做同样的事情。从编译器的角度来看,您拥有的令牌越多,性能就越差。显然,另外一个令牌不会有所作为,但想想其他人可能要求的所有其他冗余。最好强迫每个人以同样的方式做事。至少我们一定会继续回到Stack Overflow!

答案 3 :(得分:0)

我有一个有趣的观点。通常你想使用该语言的属性。如果你有一个正常形式的逻辑表达式,逻辑运算的波兰树中的主运算符是AND(&&),第一个操作数是false,语言将不计算其他操作数的值。类似地,如果逻辑运算的波兰树中的主运算符是OR(||)并且第一个operan为true,则不会计算其他操作数。我们来看几个例子

//...
// Position is a class
private bool checkMate(ref int numberOfPlies, ref ChessPosition position, int maxNumberOfPlies, List<Move> moves)
{
    if (numberOfPlies > maxNumberOfPlies)
        return false;
    position.makeMove(moves[numberOfPlies]);
    if (!(position.getSuccessOfLastMove())))
        return false;
    numberOfPlies++;
    return ((
            ((isCheckMate()) ||
            ((checkMate(ref numberOfPlies, ref position, maxNumberOfPlies, moves)))
           ));
}
//...

上述方法检查变形是否导致来自给定国际象棋位置的将死,并且将在一定数量的层中给出将死。 Position是一个类,它的makeMove()方法在给定位置移动,如果最后一次移动有效,则其getSuccessOfLastMove()为true,如果最后一次移动无效,则为false。移动是另一个类。国际象棋是一个半移动(移动=白色移动和黑色移动,Ply =白色或黑色移动)。 isCheckMate检查给定的位置是否是一个将死。

如果isCheckMate()为true,我们不想调用checkMate,因此我们不需要其他操作,而不是通常的||。

但是,这里我们要评估所有操作数:

// ... bool isThisFlowerYellowOrYellowish(花卉花) {     return(((flower.flowerColor == flower.yellow)或              (flower.FlowerColor == flower.yellowish))AND             (flower.setColorToYellowIfTheColorIsYellowish())); } //...

上面的代码不是有效的C#代码,但让我们看看为什么我们需要在C#中使用OR。 在上面的例子中,我们想运行setColorToYellowIfTheCollorIsYellowish(),即使我们在评估函数之前知道总评估的结果,但代码不工作,因为我们没有OR运算来计算所有操作数,即使我们可以知道结果。如果这是可能的,我们将无法以另一种方式编写该函数。

//...
bool isThisFlowerYellowOrYellowish(Flower flower)
{
    if (flower.FlowerColor == flower.yellowish)
        return flower.setColorToYellowIfTheColorIsYellowish();
    return (flower.flowerColor == flower.yellow);
}

// ...

与我认为的第二个例子相比,这是令人作呕的。如果我们有一个“OR”和一个“AND”运算符,它们没有被优化并且无论如何都会评估所有操作数,那么语言将更丰富,但是,我们可以在没有这些运算符的情况下生存,因为我们有替代解决方案在需要时,这是一种非常罕见的情况。

在我看来,我们不需要“NOT”运算符,因为这是一元运算符,它与!操作

在我看来,我们不应该改变!,||,&amp;&amp;,&amp;和|运算符因为所有程序员都习惯了它们。如果在C#中更改它们,则该语言将不具有向后兼容性。

编辑:

第二个想法是,如果旧操作符的含义不变,语言将具有向后兼容性,无论关键字是否,或将被引入。