?:?? 运算符代替IF | ELSE


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

简要地讲:如何不执行任何操作,什么也不返回,并与?: ??操作员一起执行多个指令?


1
但是,它的行为将不同。通过不使用有条件的if / else分支,您将在每次访问变量时无条件地(并且不必要地)重新分配变量。这可能会很快变坏,尤其是在您具有多线程代码的情况下。只是不要这样做。
Jeff Mercado

1
如果Source属性的get访问器返回Source属性(其get访问器),则您将无休止/递归调用。
约翰K

1
您的第一个代码段具有一个属性getter,该属性调用其自己的setter,而后者又递归地调用其自己的getter。您在那里迷失了我,因为在野外不可能有类似的事情。请完善您的问题,并确切说明您要实现的目标。
弗雷德里克哈米迪

一无所有 那是VB。您在这里编写C#。
任务

@Task我的意思是怎么做,这一行是关于这个问题的评论
Ahmed Ghoneim 2014年

Answers:


198

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

表达方式

a ? b : c

评估为bifa为true,评估为cifa为false。

表达方式

b ?? c

评估为bifb不为null,评估为cifb为null。

如果你写

return a ? b : c;

要么

return b ?? c;

他们将永远返回一些东西。

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


41

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


5
我还要补充一点,我已经看到人们使用嵌套的三元表达式来代替if / else,它会产生难以阅读和调试的代码。周围的坏魔力。
ckramer'6

4
如果正确使用空白,则嵌套三元运算符会产生更具可读性的代码。
真实性2011年

2
@truth:是的,我本来就不反对嵌套?:。但是对于将它们用于控制流,特别是嵌套的控制流,我遇到了一个大问题!
奥利弗·查尔斯沃思

11

指的?:运算符(C#参考)

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

?? 运算符(C#参考)

?? 运算符称为null-coalescing运算符,用于为可为空的值类型以及引用类型定义默认值。如果不为null,则返回左侧操作数;否则返回0。否则返回正确的操作数。

这意味着:

[第1部分]

return source ?? String.Empty;

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


3
这与无所作为是不同的。它返回一个空字符串。
真实性2011年

1
当然,但这不是OP要求的。这不是我的错,该OP要求“任何回报” -不管都不可能的意思。
真实性2011年

1
@trutheality:没有人说这是你的错..但是,OP不想返回任何东西,而是我提供的。
Akram Shahda 2011年

3

“什么都不做”不是真的有用吗?

如果通过//不返回任何内容,您实际上的意思是返回null然后写

return Source;

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

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

最后

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

// nothing done.

3

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

bar ? () : baz();

在这种情况下,()不执行任何操作,而baz执行任何操作。但是您只是使代码不太清楚。我想要更详细,更易于维护的详细代码。

此外,这根本没有意义:

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

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


2

如果您担心代码的冗长性,则可以编写此代码,而不要尝试滥用表达式。

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

我不是在滥用表情,我只是在想!
Ahmed Ghoneim 2014年

1

?:是行程运算符。(相信我拼写正确)并且使用简单。就像布尔谓词一样?iftrue:ifalse; 但是您必须具有rvalue / lvalue,如rvalue = predicate?iftrue:iffalse;

int i = x < 7 ? x : 7;

如果x小于7,我将被分配x,否则x将为7。

您也可以将其用作回报,例如 return x < 7 ? x : 7;

再次,如上所述,这将具有相同的影响。

因此,Source = Source == value ? Source : string.Empty;我相信这是您要达到的目标。


6
我喜欢。该路线运营商:它可以帮助你从A到B ...或者从A到C ......根据A
里克Sladkey

是的,他的意思是三元。但是正确的名称是“有条件的”。
Erick G. Hagstrom,


0

我认为您不能让它作为运算符,并且它不能返回一个或另一个。尽管可以在某些情况下用于语句替换,但不是else语句替换。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.