【问题标题】:?: ?? Operators Instead Of IF|ELSE?:??运算符而不是 IF|ELSE
【发布时间】:2011-09-06 16:12:30
【问题描述】:
public string Source
{
    get
    {
        /*
        if ( Source == null ){
            return string . Empty;
        } else {
            return Source;
        }
        */
        return Source ?? string.Empty;
    }
    set
    {
        /*
        if ( Source == null ) {
            Source = string . Empty;
        } else {
            if ( Source == value ) {
                Source = Source;
            } else {
                Source = value;
            }
        }
        */
        Source == value ? Source : value ?? string.Empty;
        RaisePropertyChanged ( "Source" );
    }
}

我可以将?:?? 运算符完全用作If/Else吗?


我的问题:
如何用 ?: ?? 编写以下内容运营商

[1]

if ( Source == null ){
    // Return Nothing
} else {
    return Source;
}

[2]

if ( Source == value ){
    // Do Nothing
} else {
    Source = value;
    RaisePropertyChanged ( "Source" );
} 

简述:如何使用?:??操作符什么都不做,什么都不返回,执行多条指令?

【问题讨论】:

  • 它的行为不会相同。通过不使用条件 if/else 分支,您每次访问它时都会无条件地(并且不必要地)重新分配变量。这可能很快就会变糟,尤其是在您拥有多线程代码的情况下。只是不要这样做。
  • 如果 Source 属性的 get 访问器正在返回 Source 属性(它的 get 访问器),您将进行无休止/递归调用。
  • 您的第一个代码 sn-p 有一个属性 getter,它调用自己的 setter,而后者又递归调用自己的 getter。你把我弄丢了,因为那样的东西不可能在现场起作用。请完善您的问题并准确解释您想要实现的目标。
  • 什么都不返回?那是VB。你在这里写 c#。
  • @Task 我的意思是怎么做,这一行是对问题的评论

标签: c# ternary-operator


【解决方案1】:

对于 [1],您不能:这些运算符用于返回值,而不是执行操作。

表达式

a ? b : c

如果a 为真,则计算为b,如果a 为假,则计算为c

表达式

b ?? c

如果b 不为空,则计算为b;如果b 为空,则计算为c

如果你写

return a ? b : c;

return b ?? c;

他们会总是返回一些东西。

对于 [2],您可以编写一个返回正确值的函数来执行您的“多个操作”,但这可能比仅使用 if/else 更糟糕。

【讨论】:

    【解决方案2】:

    三元运算符 (?:) 不是为控制流设计的,它只是为条件赋值设计的。如果您需要控制程序的流程,请使用控制结构,例如if/else

    【讨论】:

    • 我要补充一点,我看到人们使用嵌套的三元表达式代替 if/else,它产生的代码难以阅读和调试。到处都是坏魔力。
    • 如果空格使用得当,有时嵌套的三元运算符会产生更易读的代码。
    • @truth:是的,我并不反对嵌套的?: 本身。但是我有一个很大的问题是它们被用于控制流,尤其是 nested 控制流!
    【解决方案3】:

    参考?: Operator (C# Reference)

    条件运算符 (?:) 返回 取决于的两个值之一 布尔表达式的值。 以下是语法 条件运算符。

    参考?? Operator (C# Reference)

    ??运算符称为 空合并运算符和使用 为 a 定义默认值 可空值类型以及 引用类型。它返回 如果不为空,则为左操作数; 否则它返回正确的 操作数。

    这意味着:

    [第 1 部分]

    return source ?? String.Empty;
    

    [第2部分]不适用...

    【讨论】:

    • 这与什么都不做不同。它返回一个空字符串。
    • 当然,但这不是 OP 所要求的。 OP 要求“不返回任何内容”不是我的错——无论 可能意味着什么。
    • @trutheality:没有人说这是你的错……但是,OP 什么都不想要,而且我提供的也是。
    【解决方案4】:

    “什么都不做”真的不适合吗?

    如果 // Return Nothing 你的意思是 return null 然后写

    return Source;
    

    如果你的意思是,忽略代码路径然后写

     if ( Source != null )
                {
                    return Source;
                }
    // source is null so continue on.
    

    最后

     if ( Source != value )
                { Source = value;
                    RaisePropertyChanged ( "Source" );
                }
    
    // nothing done.
    

    【讨论】:

      【解决方案5】:

      三元运算符返回两个值之一。或者,它可以根据条件执行两条语句之一,但这通常不是一个好主意,因为它可能会导致意想不到的副作用。

      bar ? () : baz();
      

      在这种情况下, () 什么都不做,而 baz 做一些事情。但是您只是使代码变得不那么清晰。我会选择更详细、更清晰、更易于维护的代码。

      此外,这根本没有意义:

      var foo = bar ? () : baz();
      

      因为 () 没有返回类型(它是 void)并且 baz 有一个在此示例中调用时未知的返回类型。如果他们不同意,编译器会大声抱怨。

      【讨论】:

        【解决方案6】:

        如果您担心代码的冗长,我会写这个而不是试图滥用表达式。

        if (Source == value) return;
        Source = value;
        RaisePropertyChanged("Source");
        

        【讨论】:

        • 我不是在滥用表达,我只是在思考!
        【解决方案7】:

        ?: 是行程运算符。 (相信我拼写正确)而且使用起来很简单。 就像在布尔谓词中一样? iftrue : 错误;但是你必须有一个右值/左值,就像 rvalue = predicate 一样? iftrue: iffalse;

        int i = x < 7 ? x : 7;

        如果 x 小于 7,我将被分配 x,如果不是,我将是 7。

        您也可以在退货中使用它,如return x < 7 ? x : 7;

        再次,如上所述,这将产生相同的影响。

        所以,Source = Source == value ? Source : string.Empty; 我相信这就是你想要实现的目标。

        【讨论】:

        • 我喜欢它。 行程操作员:它可以帮助您从 A 到 B ... 或从 A 到 C ... 取决于 A。
        • 是的,他的意思是三元。但正确的名称是“有条件的”。
        【解决方案8】:

        ?: 运算符根据布尔表达式的值返回两个值之一。

        Condition-Expression ? Expression1 : Expression2
        

        在此处查找更多关于 ?: 运算符的信息,也称为三元运算符:

        【讨论】:

          【解决方案9】:

          我认为您不能将其作为运算符并假设返回一个或另一个。这不是 if else 语句替换,尽管它可以用于特定情况。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-06-16
            • 2011-10-02
            • 1970-01-01
            • 2021-07-03
            • 1970-01-01
            • 1970-01-01
            • 2022-01-17
            相关资源
            最近更新 更多