条件语句的简写:C#

51

有个快速的问题,有没有什么方法可以简化这个代码?

它基本上是确定方向左或右,1代表左,0代表右。

在C#中:

if (column == 0) { direction = 0; }
else if (column == _gridSize - 1) { direction = 1; }
else { direction = rand.Next(2); }
这句话的下一条语句将是什么?
if (direction == 1)
{
    // do something
}
else
{
    // do something else
}
如果没有的话,那也无所谓!只是好奇:)

12
为什么你想要缩短这个?在编写代码时,当前格式非常易读,这是一个值得追求的关键因素。 - Peter Smith
3
@Peter Smith - 实际上,每个if/else的分支都给同一个变量赋予不同的值,这一点并不是显而易见的。部分内容 direction = 重复了三次。通过将其提取出来,可以使它客观地清晰明了(这不仅仅是一个观点,而是基于减少无意义重复的事实)。 - Daniel Earwicker
2
我同意@Peter的观点,到目前为止所有的解决方案都比你的难以阅读。我认为没有必要进行更改。 - D'Arcy Rittich
1
@RedFilter - 你有看到原始代码中 direction = 被重复三次的方式吗? - Daniel Earwicker
2
@Daniel,我对direction的重复没有问题,因为在阅读时嵌套的三元运算符更难解析。我还会说,direction的重复使得它在每个分支中获取不同值的相同变量更加明显。 - D'Arcy Rittich
2
你完全搞反了。如果必须要字面上重复,那么就存在不必要的自由度:任何一个分支都可能与其他分支不同。你必须检查它们以确保它们是相同的 - 这使得模式不太明显。而如果语句以 direction = 开始,那么从一开始就很明显我们正在将某些东西赋值给 direction,因此语句的其余部分 必须 是产生要赋值的值的表达式。唯一的问题是,如果阅读代码的人不知道 ? : 的工作原理。 - Daniel Earwicker
4个回答

53

使用简写方式获取方向:

int direction = column == 0
                ? 0
                : (column == _gridSize - 1 ? 1 : rand.Next(2));
为了简化整个代码:
if (column == gridSize - 1 || rand.Next(2) == 1)
{
}
else
{
}

44
使用三元运算符。
direction == 1 ? dosomething () : dosomethingelse ();

2
dosomething()dosomethingelse()的返回类型必须相同。 - Javed Akram
@Javed Akram 不,它们不会。复制这段代码并编译,它可以正常运行:#include "stdio.h"char* getString () { return "String"; }int getInt () { return 5; }void main () { printf ("%s %d", 1 ? getString () : getInt (), 0 ? getString () : getInt () ); } - Hyperboreus
5
您的示例使编译器非常生气。这不是一个 C 语言问题! - R. Martinho Fernandes
6
头上灰烬!我的错!我的错!我没有看到C后面的小井号。愤怒的编译器不容忽视。 - Hyperboreus

32

是的,使用三元运算符。

condition ? true_expression : false_expression;

2
你可以写得更好 -> 条件 ? 真表达式 : 假表达式; - Tommix

5

最近,我非常喜欢使用简写的if else语句来替代switch case。在我看来,这种方式更易读,占用的空间也更少。请看下面的例子:

var redirectUrl =
      status == LoginStatusEnum.Success ? "/SecretPage"
    : status == LoginStatusEnum.Failure ? "/LoginFailed"
    : status == LoginStatusEnum.Sms ? "/2-StepSms"
    : status == LoginStatusEnum.EmailNotConfirmed ? "/EmailNotConfirmed"
    : "/404-Error";

替代

string redirectUrl;
switch (status)
{
    case LoginStatusEnum.Success:
        redirectUrl = "/SecretPage";
        break;
    case LoginStatusEnum.Failure:
        redirectUrl = "/LoginFailed";
        break;
    case LoginStatusEnum.Sms:
        redirectUrl = "/2-StepSms";
        break;
    case LoginStatusEnum.EmailNotConfirmed:
        redirectUrl = "/EmailNotConfirmed";
        break;
    default:
        redirectUrl = "/404-Error";
        break;
}

5
转换器看起来更清晰、更适合开发人员使用。编译器也无所谓 :) - Tommix
1
也许你之前没有见过三元运算符。花点时间去了解它们,三元运算符会变得更易读,而且减少了眼睛的负担。我喜欢将问号对齐,因为我很高级 :) - Jaimie Knox
1
第一个问题就像是你需要在一吨意大利面盘子中找到单根意大利面的末端。第二个问题则简单得多。 - jaysonragasa
1
我更喜欢第二个。它更易于维护(容易调试)和扩展。 - mjb
问题在于你的逻辑最终会失控,导致你读代码时每分钟WTF值飙升。这种方法并不是一步一步地进行,但它可以提示你正在做什么,而不使用switch case语句。 https://dev59.com/sGYr5IYBdhLWcg3whKit - Morten Bork
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接