Jun 14 2007
Operador IF ternário em Delphi e C#
Quem usa o Delphi 4, 5 ou 6 (talvez as versões mais novas também) deve sentir muita falta do if ternário. Este operador, além de dar mais produtividade durante o desenvolvimento da aplicação, torna o código final muito mais legível.
No livro 58+ Soluções em .NET o Thiago Fernandez fala sobre este operador no C#. Exemplificando o que ele definiu como Dado Travestido de Código, segue um breve trecho de uma solução implementada com o if normal e o equivalente com o if ternário:

Exemplo em C# utilizando o if normal

Exemplo em C# utilizando o if ternário
If ternário no Delphi
Infelizmente nas versões 4, 5 e 6 do Delphi (e talvez nas mais novas, como disse anteriormente) este operador não está disponível. Porém, existe uma maneira muito simples de simular ele.
Veja a função que utilizamos na empresa onde trabalho:

Agora imagine a seguinte situação: você tem vários checkboxes em um formulário. Quando o usuário clica no botão salvar, o valor gravado no banco de dados deverá ser Sim para os checkboxes marcados e Nao para os não marcados. Com o if ternário isto pode ser facilmente resolvido assim:

Sem a função iif você precisaria testar a propriedade Checked utilizando um if/then/else. Ou seja, teria algumas linhas a mais de código. Isto a princípio não prejudica em nada o código, mas imagine se você tiver 30 checkboxes. Vai fazer um if para cada um?
É isso ae.
Até +.








Mas isso está longe de ser a mesma coisa…
Se você fizer iif(CheckBox1.Checked, str + ‘: Sim’, str + ‘: Não’);
as duas concatenações de strings serão executadas e passadas à função, que então descartará uma. A função pode ser ainda útil, mas tem uma limitação importante!
Para solucionar isso, a linguagem deveria prover algum recurso como macros ou “lazy arguments” (como em na linguagem D), aí sim permitindo escolher o que será avaliado. Ou então o if-then-else poderia ser uma expressão em vez de um “statement”…
Seria bom se mais linguagens saíssem do “feijão-com-arroz” e adicionassem alguns recursos como esses…
Marcus,
Concordo com você. O iif executa as duas “expressões” independente do resultado. Isto é um problema, pois imagine algo do tipo:
result := iif(num = 0, 0, 5 / num);
Esse trecho de código deveria evitar uma divisão por zero. Porém ele acaba causando ela se num for igual a 0.
Mas, ainda assim gosto do iif :).
No caso dos checkboxes poupa muito código e como me acostumei com o estilo do C# (usando ?) , não abro mão, apesar de as vezes me deparar com erros como o acima.
T+
não tem uma função chamada IfThen que faz isso?
No D7 tem, acho que no D6 tb tem
Joel,
Eu não conhecia o IfThen. Acabei de testar e ele existe no Delphi 6, só tem um porém: os resultados são limitados aos tipos string, integer, int64 e double.
Algo desde tipo:
procedure TForm1.BitBtn1Click(Sender: TObject);
var
obj: TObj;
begin
obj := IfThen(1=1, TObj.Create(1), TObj.Create(2));
end;
não funcionará. Mas no caso dos checkboxes (ex. do post), é uma ótima alternativa.
Valeu pela contribuição :).
T+
procedure TForm1.Button1Click(Sender: TObject);
var
valor: string;
begin
valor := IfThen(CheckBox1.Checked, ‘Sim’, ‘Não’);
ShowMessage(valor);
end;
Marcus, você não deve estar acostumado a usar o iif não é?

Não se usa ele dessa forma que você falou, usa-se assim:
str := str+iif(CheckBox1.Checked,’Sim’,'Não’)