No Visual Basic, há uma diferença de desempenho ao usar a IIf
função em vez da If
instrução?
No Visual Basic, há uma diferença de desempenho ao usar a IIf
função em vez da If
instrução?
Respostas:
VB tem a seguinte If
declaração a que a pergunta se refere, eu acho:
' Usage 1
Dim result = If(a > 5, "World", "Hello")
' Usage 2
Dim foo = If(result, "Alternative")
O primeiro é basicamente o operador condicional ternário do C # e o segundo é o seu operador de coalescência (retornar a result
menos que seja Nothing
, nesse caso retornar "Alternative"
). If
foi assim substituído IIf
e o último está obsoleto.
Como em C #, o If
operador condicional do VB entra em curto-circuito, então agora você pode escrever com segurança o seguinte, o que não é possível usando a IIf
função:
Dim len = If(text Is Nothing, 0, text.Length)
If
é muito mais eficiente do que a IIf
função.
That's all you need to know, really
não parece uma atitude favorável para um site dedicado ao compartilhamento de conhecimento;)
IIf()
executa o código verdadeiro e falso. Para coisas simples como atribuição numérica, isso não é grande coisa. Mas, para código que requer qualquer tipo de processamento, você está desperdiçando ciclos executando a condição que não corresponde e, possivelmente, causando efeitos colaterais.
Ilustração de código:
Module Module1
Sub Main()
Dim test As Boolean = False
Dim result As String = IIf(test, Foo(), Bar())
End Sub
Public Function Foo() As String
Console.WriteLine("Foo!")
Return "Foo"
End Function
Public Function Bar() As String
Console.WriteLine("Bar!")
Return "Bar"
End Function
End Module
Saídas:
Foo!
Bar!
Além disso, outro grande problema com o IIf é que ele realmente chamará quaisquer funções que estejam nos argumentos [1], portanto, se você tiver uma situação como a seguinte:
string results = IIf(Not oraData.IsDBNull(ndx), oraData.GetString(ndx), string.Empty)
Na verdade, ele lançará uma exceção, que não é como a maioria das pessoas pensa que a função funciona na primeira vez que a vêem. Isso também pode levar a alguns bugs muito difíceis de corrigir em um aplicativo.
[1] Função IIf - http://msdn.microsoft.com/en-us/library/27ydhh0d(VS.71).aspx
É melhor usar If em vez de IIf para usar o mecanismo de inferência de tipo corretamente (Opção Infer On)
Neste exemplo, palavras-chave são reconhecidas como uma string quando eu uso If:
Dim Keywords = If(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)
Caso contrário, é reconhecido como um objeto:
Dim Keywords = IIf(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)
De acordo com esse cara , IIf pode levar até 6x mais do que If / Then. YMMV.
Além disso, a legibilidade provavelmente deve ser mais altamente preferida do que o desempenho neste caso. Mesmo que o IIF fosse mais eficiente, é simplesmente menos legível para o público-alvo (suponho que se você estiver trabalhando em Visual Basic, você deseja que outros programadores sejam capazes de ler seu código facilmente, o que é o maior benefício do VB ... e que se perde com conceitos como IIF em minha opinião).
Além disso, "IIF é uma função, versus IF sendo parte da sintaxe das linguagens" ... o que implica para mim que, de fato, If seria mais rápido ... se por nada mais do que a instrução If pode ser reduzida diretamente para um pequeno conjunto de opcodes ao invés de ter que ir para outro espaço na memória para realizar a lógica encontrada na referida função. É uma diferença banal, talvez, mas vale a pena notar.
Acredito que a principal diferença entre If e IIf é:
Se (teste [boolean], instrução1, instrução2), significa que de acordo com o valor de teste ou satement1 ou instrução2 será executado (apenas uma instrução será executada)
Dim obj = IIF (test [boolean], instrução1, instrução2) significa que as duas instruções serão executadas, mas de acordo com o valor de teste, uma delas retornará um valor para (obj).
portanto, se uma das instruções lançar uma exceção, ela a lançará em (IIf) de qualquer maneira, mas em (If) ela a lançará apenas no caso de a condição retornar seu valor.
... por que pode demorar até 6x, quoth o wiki:
Como IIf é uma função de biblioteca, sempre exigirá a sobrecarga de uma chamada de função, enquanto um operador condicional provavelmente produzirá código embutido.
Essencialmente, IIf é o equivalente a um operador ternário em C ++ / C #, portanto, fornece algumas instruções do tipo if / else de 1 linha se você quiser. Você também pode atribuir a ele uma função para avaliar, se desejar.
Essas funções são diferentes! Talvez você só precise usar a instrução IF. IIF será sempre mais lento, porque fará as duas funções e fará a instrução IF padrão.
Se você está se perguntando por que existe a função IIF, talvez esta seja a explicação:
Sub main()
counter = 0
bln = True
s = iif(bln, f1, f2)
End Sub
Function f1 As String
counter = counter + 1
Return "YES"
End Function
Function f2 As String
counter = counter + 1
Return "NO"
End Function
Portanto, o contador será 2 depois disso, mas s será apenas "SIM". Eu sei que essa coisa de contador é inútil, mas às vezes há funções que você precisará de ambas para executar, não importa se IF é verdadeiro ou falso, e apenas atribua o valor de uma delas à sua variável.
IIf()
dessa forma só vai confundir as pessoas que estão lendo seu código.
IIf
.