Jun 14 2007

Operador IF ternário em Delphi e C#

Autor: Marcos Dell Antonio - Categorias: .NET, Delphi

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 utilizando IF normal em C#
Exemplo em C# utilizando o if normal

Exemplo em C# utilizando o IF ternário
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:

IF ternário em Delphi

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:

Exemplo utilizando if ternário em Delphi

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é +.

Adicione ao del.icio.us del.icio.us | Adicione ao Rec6 Rec6

6 comentários para “Operador IF ternário em Delphi e C#”

  1. Marcusem 16 Jun 2007 3:42 am

    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…

  2. Marcos Dell Antonioem 16 Jun 2007 12:20 pm

    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+

  3. Joelem 26 Jun 2007 11:48 am

    não tem uma função chamada IfThen que faz isso?

    No D7 tem, acho que no D6 tb tem

  4. Marcos Dell Antonioem 26 Jun 2007 12:12 pm

    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+

  5. Odailem 24 Mar 2008 8:06 pm

    procedure TForm1.Button1Click(Sender: TObject);
    var
    valor: string;
    begin
    valor := IfThen(CheckBox1.Checked, ‘Sim’, ‘Não’);
    ShowMessage(valor);
    end;

  6. Georgeem 15 Jul 2008 3:44 pm

    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’)
    :)

Faça um comentário