Operadores Ternários


Estando conversando com meu amigo João Paulo Carreiro (JPC) sobre Operadores Ternários, ele me disse que ao utilizar o Operador Ternário do VB.NET (IIF) poderia ser “perigoso”, devido ao fato das duas opções serem executadas. Com isso, fiquei curioso e criei os projetos, tanto em VB.NET quanto em C# para ver o que ocorre. Abaixo os códigos em C# e VB.NET respectivamente:

[ C# ]
private System.Data.SqlClient.SqlConnection conn;
string str = (this.conn != null ? this.conn.ToString() : “Objeto esta Nulo.”);
MessageBox.Show(str);

[ VB.NET ]
Private conn As SqlClient.SqlConnection
Dim str As String = IIf(Not (Me.conn Is Nothing), Me.conn.ToString(), “Objeto esta Nulo.”)
MessageBox.Show(str)

No caso acima, no código escrito em C#, não haverá problemas pelo fato de ser realmente um Operador, e no caso do VB.NET, a falha ocorrerá, pois ele tentará retornar uma String através do método ToString() de um objeto que ainda não existe, devido ao fato de IIF ser uma função. Por isso todos os parametros devem ser executados para poderem ser passados a função, sendo assim o VB.NET não possui um operador ternário. Ao fazer o Disassembler do método IIF, temos o seguinte código:

Public Shared Function IIf(ByVal Expression As Boolean, ByVal TruePart As Object, ByVal FalsePart As Object) As Object 
    Dim obj1 As Object
    If Expression Then
        Return TruePart 
    End If
    Return FalsePart 
End Function

Agora fica claro o porque antes de chamado esta função, deve ser executado e-ou formatado os valores. Com isso vemos que independentemente da condição ser ou não atendida, as duas opções serão executadas. Para talvez “consertar” o código em VB.NET, temos que ter o objeto realmente criado:

Private conn As SqlClient.SqlConnection
Dim str As String
If Not (Me.conn Is Nothing) Then str = Me.conn.ToString() Else str = “Objeto esta Nulo.”
MessageBox.Show(str)

Ou até mesmo:

Private conn As SqlClient.SqlConnection
Dim str As String
If Not (Me.conn Is Nothing) Then
    str = Me.conn.ToString()
Else
    str = “Objeto esta Nulo.”
End If
MessageBox.Show(str)

Bem, fica aqui a dica para que se precisarem utilizar o “Operador Ternário” do VB.NET, fiquem atentos para não cairem nessa “armadilha”. 😉

Anúncios

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s