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

C# ?: ?? 运算符而不是IF | ELSE,c#,ternary-operator,C#,Ternary Operator,我可以使用?:?操作符吗?就像使用/Else一样准确地使用 我的问题: 如何用?:?写以下内容??操作员 [1] public string Source { get { /* if ( Source == null ){ return string . Empty; } else { return Source; } */ retur

我可以使用
?:
操作符吗?就像使用/Else一样准确地使用


我的问题:
如何用?:?写以下内容??操作员

[1]

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 ( Source == null ){
    // Return Nothing
} else {
    return Source;
}
[2]

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 ( Source == null ){
    // Return Nothing
} else {
    return Source;
}

简而言之:如何使用
?:
运算符?

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

the?:是行程操作员。(相信我拼写正确)而且使用起来很简单。 在布尔谓词中?如果是:如果是;但必须有一个右值/左值,如右值=谓词?如果是:如果是

ex
inti=x<7?x:7

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

您也可以在返回中使用它,如
returnx<7?x:7

同样,如上所述,这也会产生同样的影响

那么,
Source=Source==value?来源:string.Empty我相信这就是您试图实现的。

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

什么都不做对您来说真的不起作用

如果//Return Nothing实际上是指Return null,那么写

if ( Source == value ){
    // Do Nothing
} else {
    Source = value;
    RaisePropertyChanged ( "Source" );
} 
return Source;
如果你的意思是,忽略代码路径,然后写

if ( Source == value ){
    // Do Nothing
} else {
    Source = value;
    RaisePropertyChanged ( "Source" );
} 
return Source;
最后呢

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

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

提及

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

这意味着:

[第1部]

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

// nothing done.

[第2部分]不适用…

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

return source ?? String.Empty;

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

if (Source == value) return;
Source = value;
RaisePropertyChanged("Source");
在本例中,()什么也不做,而baz做了一些事情。但你只是让代码变得不那么清晰。我会选择更详细、更清晰、更易于维护的代码

此外,这毫无意义:

bar ? () : baz();

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

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

表情

var foo = bar ? () : baz();
a ? b : c
如果
a
为真,则计算为
b
;如果
a
为假,则计算为
c

表情

var foo = bar ? () : baz();
a ? b : c
如果
b
不为空,则计算为
b
,如果
b
为空,则计算为
c

如果你写信

b ?? c

他们总是会归还一些东西


对于[2],您可以编写一个函数,返回执行“多个操作”的正确值,但这可能比仅使用
if/else
更糟糕
?:
运算符根据布尔表达式的值返回两个值之一

return b ?? c;
有关
?:
运算符(也称为三元运算符)的详细信息,请参见此处:


但是,它的行为将不同。通过不使用条件if/else分支,每次访问变量时都会无条件地(不必要地)重新分配变量。这可能会很快变坏,尤其是当您有多线程代码时。不要这样做。如果源属性的get访问器返回源属性(它的get访问器),您将有一个无休止的/递归调用。您的第一个代码段有一个属性getter,它调用自己的setter,而setter反过来递归调用自己的getter。你把我弄丢了,因为这样的事情在野外是不可能发生的。请细化您的问题,并准确解释您想要实现的目标。不返回任何内容?那是VB。你在这里写c#。@Task我的意思是如何写,这一行是对这个问题的注释。我要补充的是,我见过人们用嵌套的三元表达式代替if/else,它生成的代码很难阅读和调试。到处都是糟糕的魔咒。如果正确使用空格,有时嵌套的三元运算符会产生更可读的代码。@truth:是的,我对嵌套的
?:
本身没有任何异议。但是我有一个很大的问题,它们被用于控制流,尤其是嵌套控制流!我喜欢。行程接线员:它可以帮助你从A到B。。。或者从A到C。。。取决于A。是的,他的意思是三元。但正确的名称是“有条件的”。这与无所事事不同。它返回一个空字符串。当然,但这不是OP要求的。OP要求“不归还任何东西”不是我的错——不管这可能意味着什么。@trutheality:没有人说这是你的错。。然而,OP不想返回任何东西,这就是我提供的。我没有滥用表达,我只是在思考!