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?:是行程操作员。(相信我拼写正确)而且使用起来很简单。
在布尔谓词中?如果是:如果是;但必须有一个右值/左值,如右值=谓词?如果是:如果是
exinti=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不想返回任何东西,这就是我提供的。我没有滥用表达,我只是在思考!