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”. 😉