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" );
}
}
¿Puedo usar ?:
??
operadores EXACTAMENTE como If / Else?
Mi pregunta:
¿Cómo escribir lo siguiente con?: ?? operadores
[1]
if ( Source == null ){
// Return Nothing
} else {
return Source;
}
[2]
if ( Source == value ){
// Do Nothing
} else {
Source = value;
RaisePropertyChanged ( "Source" );
}
Brevemente : ¿Cómo no hacer nada, no devolver nada y hacer varias instrucciones con el ?:
??
operador?
c#
ternary-operator
Ahmed Ghoneim
fuente
fuente
Respuestas:
Para [1], no puede: estos operadores están hechos para devolver un valor, no para realizar operaciones.
La expresion
evalúa
b
sia
es verdadero y evalúac
sia
es falso.La expresion
evalúa
b
sib
no es nulo y evalúac
sib
es nulo.Si tú escribes
return a ? b : c;
o
return b ?? c;
ellos siempre devolver algo.
Para [2], puede escribir una función que devuelva el valor correcto que realice sus "operaciones múltiples", pero probablemente sea peor que simplemente usar
if/else
.fuente
El operador ternario (
?:
) no está diseñado para controlar el flujo , solo está diseñado para una asignación condicional . Si necesita controlar el flujo de su programa, use una estructura de control, comoif
/else
.fuente
?:
per se. Pero tengo un gran problema con que se utilicen para el flujo de control, ¡y especialmente el flujo de control anidado !Haciendo referencia a ?: Operador (Referencia de C #)
Refiriéndose a ?? Operador (referencia de C #)
Eso significa:
[Parte 1]
return source ?? String.Empty;
[Parte 2] no es aplicable ...
fuente
¿El "no hacer nada" realmente no funciona?
si por // Devolver nada, en realidad te refieres a devolver nulo, entonces escribe
return Source;
si quiere decir, ignore la ruta de código y luego escriba
if ( Source != null ) { return Source; } // source is null so continue on.
Y por ultimo
if ( Source != value ) { Source = value; RaisePropertyChanged ( "Source" ); } // nothing done.
fuente
El operador ternario DEVUELVE uno de dos valores. O puede ejecutar una de dos declaraciones en función de su condición, pero generalmente no es una buena idea, ya que puede provocar efectos secundarios no deseados.
En este caso, el () no hace nada, mientras que baz hace algo. Pero solo ha hecho que el código sea menos claro. Yo optaría por un código más detallado, más claro y fácil de mantener.
Además, esto tiene poco sentido en absoluto:
var foo = bar ? () : baz();
ya que () no tiene un tipo de retorno (es nulo) y baz tiene un tipo de retorno que se desconoce en el punto de llamada en este ejemplo. Si no están de acuerdo, el compilador se quejará en voz alta.
fuente
Si le preocupa la verbosidad de su código, escribiría esto en lugar de intentar abusar de las expresiones.
if (Source == value) return; Source = value; RaisePropertyChanged("Source");
fuente
el?: es el operador del itinerario. (creo que lo escribí correctamente) y es fácil de usar. como en un predicado booleano? iftrue: ifalse; ¿Pero debe tener un rvalue / lvalue como en rvalue = predicate? iftrue: iffalse;
ex
int i = x < 7 ? x : 7;
si x fuera menor que 7, me asignarían x, si no, sería 7.
también puede usarlo en una devolución, como en
return x < 7 ? x : 7;
de nuevo, como antes, esto tendría el mismo efecto.
Source = Source == value ? Source : string.Empty;
Entonces , creo que es lo que estás tratando de lograr.fuente
El
?:
operador devuelve uno de dos valores según el valor de una expresión booleana.Encuentre aquí más información sobre el
?:
operador, también conocido como operador ternario:fuente
No creo que pueda, es un operador y se supone que debe devolver uno u otro. No es el reemplazo de la declaración if else, aunque se puede usar para eso en ciertos casos.
fuente