【问题标题】:Do nothing when "other side" of ternary operator is reached?当到达三元运算符的“另一面”时什么都不做?
【发布时间】:2017-04-30 00:53:43
【问题描述】:

注意:我以前曾看到过这个问题(abc),但这些都不是 C# 中的,也没有帮助。

假设我像这样使用? : 三元运算符(false 是这种情况时什么都不做):

r==5? r=0 : <nothing> ;

我遇到了一个错误。放东西在那里显然会解决问题。 我怎样才能在不做一些随机的空函数的情况下保持另一侧为空?

【问题讨论】:

  • 你能给出一个非伪代码示例吗?
  • Do nothing keyword in C#?的可能重复
  • 当你知道你不想为一个案例做任何事情时,三元(条件)运算符有什么用?
  • @krillgar r==5? r=0 : &lt;nothing&gt; ;
  • 如果你真的想使用条件表达式,你可以使用r = (r == 5 ? 0 : r),但你应该只使用if 语句,即if (r == 5) { r = 0; }

标签: c# syntactic-sugar


【解决方案1】:

你不能。条件 ?: 运算符的全部意义在于它计算 表达式。你甚至不能只使用:

Foo() ? Bar() : Baz();

... 因为那不是陈述。你必须对结果做一些事情......就像你访问一个属性时一样,例如。

如果您只想在满足特定条件时执行一段代码,那么 ?: 运算符不是您想要的 - 您需要 if 语句:

if (foo)
{
    bar();
}

就这么简单。不要试图将条件运算符扭曲成它不应该的东西。

【讨论】:

  • 这就像说你要么想调用 bar()。
  • 我的例子有点不对劲,我把它更新到了现在的样子。
  • @devRicher:原理还是一样的。
  • @devRicher:更糟糕的是,您的第二个操作数现在是一个副作用。你实际上想要完成什么?听起来你想要if (r == 5) { r = 0; } 。如果这就是你想要的,为什么不使用它呢?
  • @devRicher:你的意思是你希望它去 0、1、2、3、4、0、1、2、3、4 等等?如果是这样,你想要:r = (r + 1) % 5;。同样,不需要条件运算符。
【解决方案2】:

当您显然需要两个参数时,为什么要使用 三元?您可以简单地使用 if 语句:

 if(Condition())Action();

【讨论】:

    【解决方案3】:

    其他答案是正确的,但他们错过了一个关键点,我认为这是您遇到的主要问题。需要注意的是

    r = 0

    除了分配r 一个值之外,还返回相同的值。你可以把它想象成一个函数。你可以调用一个函数,除了返回一个值之外,它可能会做一些其他的事情,你可能会也可能不会使用它。

    举个例子:

    int square(int n)
    {
        // Now you can do other things here too. Maybe you do something with the UI in here:
        Console.WriteLine("Calculating...");
        // ^ Now thing of the above code as assigning a value to a variable.
        return n * n;
        // But after assigning the value, it also returns the value...
    }
    

    所以,现在假设您可能有两个用例:

    var x = square(2);
    // -- OR --
    square(2);
    

    请注意,两个语句都输出'Calculating...',但前者将2 * 24 的值分配给x

    更好的是,假设我们有一个函数:

    int AssignValueToVariable(out int variable, int value)
    {
        variable = value;
        return value;
    }
    

    现在这个函数显然是多余的,但让我们假设我们可以使用它来更好地理解。假设它等价于赋值=运算符。

    也就是说,我们可以回到我们的场景。三元运算符&lt;condition&gt; ? &lt;true expression&gt; : &lt;false expression&gt; 接受两个表达式以根据指定条件返回。所以,当你写的时候:

    r == 5 ? r = 0 : r = 2; // Let's suppose the third operand to be r = 2
    

    相当于:

    r == 5 ? AssignValueToVariable(r, 0) : AssignValueToVariable(r, 2)
    

    两者本质上都是:

    r == 5 ? 0 : 2
    

    这又带回了操作数必须是表达式的硬性规则,因为整个事物必须归结为一个表达式。因此,您可以通过使用表达式的默认值来获得表达式的种类“无”等价物。

    或者,正如其他答案所提到的,使用if 声明,直截了当:

    if (r == 5)
        r = 0;
    

    从您提供的代码推断,我猜您正在使用评估的表达式做一些事情。您可以将值存储在单独的变量 result 中并对其进行任何处理:

    int result;
    if (r == 5)
        result = r = 0; // This sets the value of both result and r to 0
    

    现在,您可以将result 替换为您想要的先前表达式,即r == 5 ? r = 0 : &lt;nothing&gt; // Pseudo-code

    希望对你有帮助:)

    【讨论】:

      【解决方案4】:

      如果您真的愿意,现在可以使用Discard 运算符实现此目的。

      public class Program
      {
          public static void Main()
          {
              int r=5;
              _ = r==5 ? r=0 : 0;
              Console.WriteLine($"{r}");
              // outputs 0
          }
      }
      

      你现在也可以这样做

      _=Foo() ? Bar() : Baz();
      

      只要 Bar 和 Baz 返回相同或可转换的类型。

      【讨论】:

        【解决方案5】:

        我可以建议这样的扩展方法:

        public static T ChangeOn<T>(this T variable, bool condition, T newValue)
        {
            return condition ? newValue : variable;
        }
        

        并像这样使用它:

        var result = r.ChangeOn(r == 5, 0);
        //or: r = r.ChangeOn(r == 5, 0); for self change
        

        【讨论】:

        • 因为在查看整个代码监视器时,许多人在快速准确地阅读逻辑符号方面比英文语句更熟练。可以有效阅读的语法是有效的编码。这包括以英语为母语的人。任何涉及许多括号(在小写字母上方和下方延伸)的内容都会显着增加整个屏幕的视觉噪音。
        【解决方案6】:

        只需将 undefined 传递给您不想做任何事情的一侧。

        // An array of numbers
        let test = [12, 929, 11, 3]
        
        // Adds 100 to the element in the text array if it is divisible by 3.
        test.forEach(function (element, index) {
          element % 3 ? undefined : test[index] += 100;
        });
        
        // Logs the test array to the screen
        console.log(test);

        将“未定义”传递到您要忽略的三元表达式的一侧就是这样做的。

        【讨论】:

          猜你喜欢
          • 2015-08-31
          • 2021-02-26
          • 1970-01-01
          • 2021-10-17
          • 2020-11-05
          • 1970-01-01
          • 1970-01-01
          • 2021-08-30
          • 1970-01-01
          相关资源
          最近更新 更多