我的if stetement:
if (!string.IsNullOrEmpty(Person.Name))
// some code
我认为“!”编写命令式代码时,运算符的可读性较差,
您是否同意我以下代码更具可读性?
if (not string.IsNullOrEmpty(Person.Name))
// some code
我不是在谈论替换当前的运算符,但如果语言同时接受它们,问题出在哪里?
答案 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#中更改它们,则该语言将不具有向后兼容性。
编辑:
第二个想法是,如果旧操作符的含义不变,语言将具有向后兼容性,无论关键字是否,或将被引入。