2011-03-09 42 views
20

Duplicar posible:
Is there, or is there ever going to be, a conditional operator in Delphi?Delphi - ¿Equivalente al operador ternario de C#?

entiendo Delphi tampoco tienen el operador ternario como en C#. es decir ?:

Entonces, ¿cuál es la mejor manera de representar esta llamada de función? ¿Cuál es el método más limpio que hay?

Sería muy agradable si hay algún código que se pueda usar EN LUGAR de escribir una función separada? De lo contrario, ¿cuál es la representación del código más eficiente y/o más limpia?

+1

No hay tal cosa como "* * el operador ternario". Un operador ternario es * cualquier * operador que acepta tres operandos. Probablemente se esté refiriendo a un operador ternario específico, a saber, '?:'. –

+0

Gracias Mikael, votado para cerrar. – Simon

+3

@Andreas, si solo hay un operador ternario, entonces es * el * operador ternario. También podemos llamarlo por su nombre, el operador condicional. Del mismo modo, solo hay una persona que publicó el primer comentario sobre esta pregunta. Podemos llamarlo la persona que publicó el primer comentario sobre esta pregunta, o podemos llamarlo por su nombre, Andreas. –

Respuesta

35

Por supuesto se puede utilizar

IfThen(SomeBooleanExpression, IfTrueReturnValue, IfFalseReturnValue) 

donde los valores de retorno son numéricos (uses Math) o cadena (uses StrUtils). Pero observe que esto evaluará ambos argumentos en todos los casos: no hay evaluación diferida, por lo que no es tan eficiente como el operador ?: en C#, donde solo se evalúa el operando correcto.

Así que no se puede hacer

y := IfThen(x <> 0, 1/x, 0) 

Lo mejor es seguir con un ordinario

if x <> 0 then y := 1/x else y := 0; 
+0

Damn esperaba evitar todo mi pequeño 'si entonces elses' :( – Simon

+2

No sé si este sigue siendo el caso, pero el inconveniente de usar IfThen solía ser (/ is) que todas las partes siempre se evalúan y no se puede evitar violaciones de acceso como lo hace con las sentencias if "normales". IE 'if Assigned (A) then X: = A.DoSome else X: = '';' –

+1

Ah, vea ahora que mencionó la evaluación perezosa, pero utilizó la división por cero como el ejemplo ... –

3

es la más cercana:

if (condition) then <staement> else <statement>; 

espero que ayude. Por lo que recuerdo, no hay ningún operador de terneras en Delphi.

+0

Disculpe, hubo un error tipográfico. No recuerdo a un operador de terneras en Delphi. –

2

Prueba el Iff de Jedi:

function Iff(const Condition: Boolean; const TruePart: string; const FalsePart: string): string; overload; 
function Iff(const Condition: Boolean; const TruePart: Char; const FalsePart: Char): Char; overload; 
function Iff(const Condition: Boolean; const TruePart: Byte; const FalsePart: Byte): Byte; overload; 
function Iff(const Condition: Boolean; const TruePart: Integer; const FalsePart: Integer): Integer; overload; 
function Iff(const Condition: Boolean; const TruePart: Cardinal; const FalsePart: Cardinal): Cardinal; overload; 
function Iff(const Condition: Boolean; const TruePart: Float; const FalsePart: Float): Float; overload; 
function Iff(const Condition: Boolean; const TruePart: Boolean; const FalsePart: Boolean): Boolean; overload; 
function Iff(const Condition: Boolean; const TruePart: Pointer; const FalsePart: Pointer): Pointer; overload; 
function Iff(const Condition: Boolean; const TruePart: Int64; const FalsePart: Int64): Int64; overload; 
function Iff(const Condition: Boolean; const TruePart: Variant; const FalsePart: Variant): Variant; overload; 
+3

Sí, esta es una versión "extendida" de las funciones 'IfThen' de RTL. Pero todavía sufre de errores mismo problema que las funciones 'IfThen', en comparación con'?: '. –

+0

Sí, no es lo mismo que?: – Simon

Cuestiones relacionadas