【问题标题】:Is there any way to avoid use of Ternary Operator?有什么办法可以避免使用三元运算符?
【发布时间】:2017-08-30 19:24:38
【问题描述】:
User.UserRoleID == 9 ? false : true

假设这是我的情况,它现在使用三元运算符。
有人可以建议除 If 之外的其他方法

【问题讨论】:

  • 代码的上下文是什么?是退货声明吗?或者其他被分配了这个真/假值的东西?
  • if 有什么问题?
  • 你可以用无代码替换你的代码行,它没有任何作用。
  • @Jodrell:你真的认为if (User.UserRoleID == 9) return false; else return true; 更好吗?
  • 我认为 Jodrell 是在取笑这个问题,实际上意味着根本不使用任何代码(也就是不使用三元运算符的最佳方法)。

标签: c# ternary-operator


【解决方案1】:

You should use an if. Seriously;但如果由于任何原因您不能让自己使用那个农民 if 语句 (¿?),您可以使用 switch

return (User.UserRoleID == 9) ? false : true

switch(User.UserRoleID == 9){
    case true:
        return true;
    case false:
        return false;
    default:
        //return... wait, what?
        throw new Exception("Boolean math broken. Please, restart the universe");
 }

对于更一般的情况:

return (User.UserRoleID == 9) ? doOneThing(): doTheOtherThing();

switch(User.UserRoleID == 9){
    case true:
        return doOneThing();
    case false:
        return doTheOtherThing();
}

有些人不喜欢这种切换方法。好吧,您也可以尝试另一个:

try {
    bool result = User.UserRoleID == 9;
    throw new Activator.CreateInstance(result.ToString() + "Exception");
} catch (TrueException e){
    return doOneThing();
}catch(FalseException e){
    return doTheOtherThing();
}

注意:请不要这样做。你可以这样做,但这太可怕了,如果他们看到这段代码,你会被鄙视(甚至可能被解雇)。请注意

【讨论】:

  • 为什么投反对票?是因为这是一种可怕的做任何事情的方式,而且只是看到它就很痛吗?它是!确实如此! ..但是OP不想使用正确的ifs!
  • A switch... 用于布尔值。第三种情况的默认值......布尔值。请改用if
  • 好吧,我没有发现 OP 正在寻找不涉及 if 的解决方案。在这种情况下,这个答案值得对创造力投赞成票。
  • @ray:开关不是决定性的,default 是不必要的(并且无法访问)吗?手头没有 C# 编译器,但我想你可以在编译器不抱怨的情况下删除它。
  • @DarkDust 你是对的,但是让显而易见的事情变得显而易见会有所帮助。我经常看到将失败的断言添加为安全网,以防以某种方式到达无法访问的代码(例如,有人修改了代码的一部分,而不是另一部分,并引入了错误)
【解决方案2】:

Patrick Hofman 的 answer 非常适合 OP 案例,因为它非常具体返回真/假。对于更一般的情况,如果是要走的路

User.UserRoleID == 9 ? doOneStuff() : doTheOtherStuff()

它可以很容易地被等效的 if/else 替换

if(User.UserRoleID == 9){
   doOneStuff();
}else{
   doTheOtherStuff();
}

在赋值和返回的情况下,需要在两个分支中表达左边部分:

 int foo = (User.UserRoleID == 9) ? doOneStuff() : doTheOtherStuff()

 if(User.UserRoleID == 9){
       int foo = doOneStuff();
    }else{
       int foo = doTheOtherStuff();
    }

如果这个三元是一个参数,你需要明确地将它提取到一个变量中:

int result = myFunction(User.UserRoleID == 9 ? 4 : 5)

 int parameter;
 if(User.UserRoleID == 9){
       parameter = 4;
    }else{
       parameter = 5;
    }
result = myFunction(parameter);

【讨论】:

    【解决方案3】:

    使用User.UserRoleID == 9 代替truefalse 文字怎么样?如果这最终在整个代码中重复,那就不理想了,但如果你只需要一次或两次......

    【讨论】:

      【解决方案4】:

      转过来对比一下:

      bool b = User.UserRoleID != 9;
      

      【讨论】:

      • 是的,SO 以消极的方式变得疯狂。我不介意它是否停在 0... @LukeG
      • 我建议在User.UserRoleID != 9 周围加上括号,这样任何阅读您代码的人都会确信您知道自己在做什么。尤其是在您看不到 b 是什么类型的情况下。
      • @LukeG:赞成票是对问题答案是否合适的判断,而不是对所提出问题的挑战的评估。因此,对简单问题的简单回答与其他任何事情一样有价值。
      • @LukeG 投票是基于个人问题的个人答案是否被认为是“有用的”。恕我直言,问题本身的相对复杂性似乎无关紧要。将其与其他答案进行比较,其中一些尝试更有创意,而这个似乎更有用。
      • @xDaizu 因此,我明确表示这是“个人问题的个人答案”。我知道,也没有暗示或暗示,这种方法可以在其他情况下使用。
      猜你喜欢
      • 2014-02-07
      • 2014-05-25
      • 1970-01-01
      • 2020-02-01
      • 1970-01-01
      • 2021-11-22
      • 1970-01-01
      • 2013-10-09
      • 1970-01-01
      相关资源
      最近更新 更多