?:??运算符而不是IF | ELSE

时间:2011-06-01 21:40:42

标签: c# ternary-operator

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" );
} 

简要:如何做任何事情,不返回任何内容并使用?: ??运营商执行多项指示?

9 个答案:

答案 0 :(得分:184)

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

表达式

a ? b : c
如果b为真,则

评估为a;如果c为假,则评估为a

表达式

b ?? c
如果b不为空,则

评估为b;如果c为空,则评估为b

如果你写

return a ? b : c;

return b ?? c;

他们总是返回一些东西。

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

答案 1 :(得分:40)

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

答案 2 :(得分:10)

参考?: Operator (C# Reference)

  

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

参考?? Operator (C# Reference)

  

??运营商被称为   使用null-coalescing运算符   为a定义默认值   可空值的类型以及   参考类型。它返回   左手操作数,如果它不为空;   否则它返回权利   操作数。

这意味着:

[第1部分]

return source ?? String.Empty;

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

答案 3 :(得分:3)

“什么都不做”并不适用?

如果通过//返回Nothing你实际上意味着返回null然后写

return Source;

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

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

最后一次

 if ( Source != value )
            { Source = value;
                RaisePropertyChanged ( "Source" );
            }

// nothing done.

答案 4 :(得分:3)

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

bar ? () : baz();

在这种情况下,()不执行任何操作,而baz执行某些操作。但是你只是使代码不那么清晰。我会选择更详细,更清晰,更易于维护的代码。

此外,这根本没有意义:

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

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

答案 5 :(得分:2)

如果您关注代码的详细程度,我会写这个而不是试图滥用表达式。

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

答案 6 :(得分:1)

?:是行程运营商。 (相信我拼写正确)并且使用起来很简单。 在布尔谓词中? iftrue:ifalse;但是你必须有rvalue / lvalue,如rvalue = predicate? iftrue:iffalse;

ex int i = x < 7 ? x : 7;

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

您也可以在回复中使用它,例如return x < 7 ? x : 7;

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

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

答案 7 :(得分:1)

?:运算符返回两个值中的一个,具体取决于布尔表达式的值。

Condition-Expression ? Expression1 : Expression2

?:运算符上找到更多信息,也称为三元运算符:

答案 8 :(得分:0)

我认为你不能把它作为一个操作者并且假设它可以返回一个或另一个。这不是if else语句替换,尽管在某些情况下它可以用于此。