¿Existe un IIf
equivalente en C #? ¿O un atajo similar?
c#
.net
conditional-operator
iif-function
Saif Khan
fuente
fuente
Respuestas:
C # tiene el
?
operador ternario, como otros lenguajes de estilo C. Sin embargo, esto no es perfectamente equivalente aIIf()
; hay dos diferencias importantes.Para explicar la primera diferencia, el argumento de la parte falsa para esta
IIf()
llamada causa aDivideByZeroException
, aunque el argumento booleano esTrue
.IIf(true, 1, 1/0)
IIf()
es solo una función y, como todas las funciones, todos los argumentos deben evaluarse antes de realizar la llamada. Dicho de otra manera,IIf()
lo hace no cortocircuito en el sentido tradicional. Por otro lado, esta expresión ternaria hace un cortocircuito, por lo que está perfectamente bien:(true)?1:1/0;
La otra diferencia es
IIf()
que no es seguro de tipos. Acepta y devuelve argumentos de tipoObject
. El operador ternario es de tipo seguro. Utiliza la inferencia de tipos para saber con qué tipos está tratando. Tenga en cuenta que puede solucionar este problema muy fácilmente con su propio genéricoIIF(Of T)()
implementación , pero no es así de inmediato.Si realmente lo desea
IIf()
en C #, puede tenerlo:object IIf(bool expression, object truePart, object falsePart) {return expression?truePart:falsePart;}
o una implementación genérica / segura de tipos:
T IIf<T>(bool expression, T truePart, T falsePart) {return expression?truePart:falsePart;}
Por otro lado, si desea el operador ternario en VB, Visual Studio 2008 y versiones posteriores proporcionan un nuevo
If()
operador que funciona como el operador ternario de C #. Utiliza la inferencia de tipos para saber lo que está devolviendo, y realmente es un operador en lugar de una función. Esto significa que no hay problemas con la evaluación previa de expresiones, aunque tiene semántica de funciones.fuente
VB.NET:
If(someBool, "true", "false")
C#
someBool ? "true" : "false";
fuente
el operador ternario
bool a = true; string b = a ? "if_true" : "if_false";
fuente
También es útil el operador de fusión ??:
VB:
Return Iif( s IsNot Nothing, s, "My Default Value" )
C#:
return s ?? "My Default Value";
fuente
Ejemplo:
string itemText = count > 1 ? "items" : "item";
http://zamirsblog.blogspot.com/2011/12/c-vb-equivalent-of-iif.html
fuente
Es el operador ternario
?
string newString = i == 1 ? "i is one" : "i is not one";
fuente
Está limitado en el sentido de que no puede poner declaraciones allí. Solo puede poner valores (o cosas que devuelven / evalúan a valores), para devolver
Esto funciona ('a' es un int estático dentro de la clase Blah)
Blah.a=Blah.a<5?1:8;
(los corchetes están implícitamente entre los iguales y el signo de interrogación).
Esto no funciona.
Blah.a = Blah.a < 4 ? Console.WriteLine("asdf") : Console.WriteLine("34er"); or Blah.a = Blah.a < 4 ? MessageBox.Show("asdf") : MessageBox.Show("34er");
Por lo tanto, solo puede usar el operador ternario c # para devolver valores. Así que no es como una forma abreviada de un if. Javascript y quizás algunos otros lenguajes le permiten poner declaraciones allí.
fuente
Action
para hacer lo que quieras.iif
o el operador ternario, le permiten poner un valor de retorno allí comoBlah.a = Blah.a < 4 ? Console.WriteLine("asdf"); return 1: Console.WriteLine("34er") ; return 2;
si lo permitiera, funcionaría, pero aparentemente no es así. Y sí, todavía está estableciendo un valor, y no, no está llamando a ningún método nuevo allí.