-6

下面的类中的逻辑if-else语句尽可能短,c# 允许,或者这个语句可以更短吗?

?: MSDN 上的逻辑结构在某些情况下是捷径,但不是以下情况?

class Stats
{
    public int Total = 0;
    public int Missed = 0;
    public int Correct = 0;
    public int Accuracy = 0;

    void Update(Boolean correctKey)
    {
        //correctKey ? Correct++ : Missed++; //incorrect syntax for this situation as the ? operator is used to set a value
        if (correctKey==true) Correct++;  else  Missed++; //shortest c# syntax?
    }
}
4

6 回答 6

5

条件运算符旨在与assignments一起使用,而不是作为if/else语句的通用替代品。这是因为它产生一个结果(它是一个表达式),然后将该结果分配给其他东西。

例如,考虑以下语句:

var a = x != null ? x : y;

这会将变量的值设置a为 objectx如果它不为 null,或者如果它是 object y。这里的目标是可读性。一些程序员发现更容易阅读具有极其常见和直接逻辑的语句,例如单行中的语句,而不是分散到if/else块中。

(由于我们有 null-coalescing 运算符,这种模式在 C# 中基本上是不合时宜的,但它是一个很好的教学案例。)

相反,您在此处尝试表达的内容实际上不适用于条件运算符,因为它没有结果并且没有执行赋值。

在这种情况下,我会说if/else块是您的最佳选择。请注意,较短的代码不一定会产生更快的代码。事实上,在更多情况下,编译器或 JITer 会生成具有相同性能的等效代码。不要(ab)使用条件运算符来尝试使您的代码更快,只有在它使您的代码更清晰易读时才使用它。如果可读性或表现力需要将某些内容分成多行,那么这样做并没有错。

正如其他示例所示,您实际上可以将if/else块组合成一行:

if (correctKey) Correct++; else Missed++;

但这也不会使代码运行得更快,它只是把它们塞在一起。就像连贯的句子一样,应该在意思明确无误的情况下明智地使用它。

于 2012-07-25T07:47:43.550 回答
3

三元运算符在更新语句中不起作用,因为它单独构成一个表达式并且需要分配值。

于 2012-07-25T07:42:06.970 回答
2

试试这个

if (correctKey) Correct++;  else  Missed++;

您只能在实际发出结果的语句中使用条件运算符,例如

var result = correctKey ? Correct++ : Missed++;

result将是之前的值,Correct或者Missed在它增加之前。

于 2012-07-25T07:42:41.810 回答
2

根据您的要求,可以使用三元运算符作为任何一种情况。

假设值为

correctKey = false;
Correct = 1;
Missed = 2;

tempVar = correctKey ? Correct++ : Missed++;  // Result: 2

或者

tempVar = correctKey ? ++Correct : ++Missed;  // Result: 3 

编辑:

对于这两种情况,值都在递增。因此,该语句也可以写成如下:-

tempVar = (correctKey ? Correct : Missed)+1;  // Result: 3
于 2012-07-25T07:43:22.987 回答
1
var temp = correctKey == true ? Correct++ : Missed++;
于 2012-07-25T07:40:55.373 回答
1

if(...) 检查括号中的语句是否为“真”。可以写

 if(correctKey)
    Correct++;
 else
    Missed++;

对于像您这样的简短陈述,请使用:

correctKey == true ? Correct++ : Missed++;
于 2012-07-25T07:44:42.857 回答