reusable patterns net guidelines framework for and c# .net ternary-operator iif-function

c# - framework design guidelines conventions idioms and patterns for reusable.net libraries



iif equivalente en c# (7)

¿Es el operador ternario ?

string newString = i == 1 ? "i is one" : "i is not one";

¿Hay un equivalente de IIf en C# ? ¿O atajo similar?


C # tiene el "?" Operador ternario, al igual que otros lenguajes de estilo C Sin embargo, esto no es perfectamente equivalente a iif. Hay dos diferencias importantes.

Para explicar la primera, esta llamada iif() causaría una excepción DivideByZero aunque la expresión sea verdadera porque iif es solo una función y todos los argumentos deben ser evaluados antes de llamar:

iif(true, 1, 1/0)

Dicho de otra manera, iif no hace un corto circuito en el sentido tradicional, como lo indica su pregunta. Por otro lado, esta expresión ternaria lo hace y por lo tanto está perfectamente bien:

(true)?1:1/0;

La otra diferencia es que iif no es de tipo seguro. Acepta y devuelve argumentos de tipo object . El operador ternario usa la inferencia de tipos para saber con qué tipo se está tratando. Tenga en cuenta que puede solucionar este problema muy fácilmente con una implementación genérica, pero de inmediato, así es como es.

Si realmente quieres iif () en C #, puedes tenerlo:

object iif(bool expression, object truePart, object falsePart) {return expression?truePart:falsePart; }

o una implementación genérica / segura para el tipo:

T iif<T>(bool expression, T truePart, T falsePart) { return expression?truePart:falsePart;}

Por otro lado, si desea que el operador ternario en VB, Visual Studio 2008 y posterior proporcione un nuevo operador If que funcione más como el ternario de C #. Utiliza la inferencia de tipos para saber qué está devolviendo, y es un operador en lugar de una función, por lo que a pesar de que tiene una función semántica, no hay problemas con las expresiones de evaluación previa.


Está limitado en que no puedes 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 paréntesis son impicitos 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 c # ternario para valores de retorno. Así que no es como una forma abreviada de un if. Javascript y tal vez algunos otros idiomas le permiten poner declaraciones allí.


También es útil el operador de fusión ??:

VB:

Return Iif( s IsNot Nothing, s, "My Default Value" )

DO#:

return s ?? "My Default Value";


VB.NET:

If(someBool, "true", "false")

DO#

someBool ? "true" : "false";


el operador ternario

bool a = true; string b = a ? "if_true" : "if_false";