Frage

Gibt es in Visual Basic einen Leistungsunterschied bei der Verwendung von? IIf Funktion anstelle der If Stellungnahme?

War es hilfreich?

Lösung

VB hat Folgendes If Aussage, auf die sich die Frage bezieht, denke ich:

' Usage 1
Dim result = If(a > 5, "World", "Hello")
' Usage 2
Dim foo = If(result, "Alternative")

Der erste ist im Grunde der ternäre Bedingungsoperator von C# und der zweite ist der Koaleszenzoperator (return). result es sei denn, es ist so Nothing, in diesem Fall zurückkehren "Alternative"). If hat somit ersetzt IIf und Letzteres ist veraltet.

Wie in C# ist VB bedingt If Operator-Kurzschlüsse, so dass Sie jetzt sicher Folgendes schreiben können, was mit dem nicht möglich ist IIf Funktion:

Dim len = If(text Is Nothing, 0, text.Length)

Andere Tipps

IIf() führt sowohl den wahren als auch den falschen Code aus.Für einfache Dinge wie numerische Zuweisungen ist das keine große Sache.Bei Code, der irgendeine Art von Verarbeitung erfordert, verschwenden Sie jedoch Zyklen, in denen die Bedingung ausgeführt wird, die nicht übereinstimmt, was möglicherweise zu Nebenwirkungen führt.

Code-Abbildung:

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

Ausgänge:

Foo!
Bar!

Ein weiteres großes Problem mit IIf besteht darin, dass es tatsächlich alle Funktionen aufruft, die in den Argumenten [1] enthalten sind. Wenn Sie also eine Situation wie die folgende haben:

string results = IIf(Not oraData.IsDBNull(ndx), oraData.GetString(ndx), string.Empty)

Es wird tatsächlich eine Ausnahme ausgelöst, was die meisten Leute nicht glauben, dass die Funktion funktioniert, wenn sie sie zum ersten Mal sehen.Dies kann auch zu einigen sehr schwer zu behebenden Fehlern in einer Anwendung führen.

[1] IIf-Funktion - http://msdn.microsoft.com/en-us/library/27ydhh0d(VS.71).aspx

Verwenden Sie besser If anstelle von IIf, um den Typinferenzmechanismus korrekt zu verwenden (Option Infer On).

In diesem Beispiel wird Keywords als Zeichenfolge erkannt, wenn ich If verwende:

Dim Keywords = If(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)

Andernfalls wird es als Objekt erkannt:

Dim Keywords = IIf(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)

Entsprechend dieser Typ, IIf kann bis zu 6x so lange dauern wie If/Then.YMMV.

Darüber hinaus sollte in diesem Fall wahrscheinlich die Lesbarkeit höher sein als die Leistung.Selbst wenn IIF effizienter wäre, ist es für die Zielgruppe einfach weniger lesbar (ich gehe davon aus, dass Sie, wenn Sie in Visual Basic arbeiten, möchten, dass andere Programmierer Ihren Code leicht lesen können, was der größte Vorteil von VB ist ...und was meiner Meinung nach bei Konzepten wie IIF verloren geht).

Auch, „IIF ist eine Funktion, während IF Teil der Syntax der Sprachen ist“...was für mich impliziert, dass If tatsächlich schneller wäre ...Aus diesem Grund kann die If-Anweisung direkt auf einen kleinen Satz von Opcodes reduziert werden, anstatt an einen anderen Speicherort gehen zu müssen, um die in der Funktion enthaltene Logik auszuführen.Es ist vielleicht ein banaler Unterschied, aber erwähnenswert.

Ich glaube, dass der Hauptunterschied zwischen If und IIf darin besteht:

  • If (test [boolean], Erklärung1, Anweisung2) bedeutet, dass nach dem Testwert Satement1 oder Anweisung2 ausgeführt wird (nur eine Anweisung wird ausgeführt)

  • Dim Obj = IIF (Test [boolean], Anweisung1, Anweisung2). Es bedeutet, dass beide Aussagen ausgeführt werden, aber gemäß dem Testwert einer von ihnen wird einen Wert an (OBJ) zurückgeben.

Wenn also eine der Anweisungen eine Ausnahme auslöst, wird sie diese trotzdem in (IIf) auslösen, in (If) jedoch nur für den Fall, dass die Bedingung ihren Wert zurückgibt.

...warum es bis zu 6x dauern kann, sagt das Wiki:

Da IIF eine Bibliotheksfunktion ist, erfordert es immer den Overhead eines Funktionsaufrufs, während ein bedingter Bediener eher einen Inline -Code erzeugt.

Im Wesentlichen ist IIf das Äquivalent eines ternären Operators in C++/C#, sodass Sie bei Bedarf einige nette einzeilige if/else-Anweisungen erhalten.Sie können ihm bei Bedarf auch eine Funktion zur Auswertung zuweisen.

Diese Funktionen sind unterschiedlich!Möglicherweise müssen Sie nur die IF-Anweisung verwenden.IIF wird immer langsamer sein, da es beide Funktionen ausführt und zusätzlich die Standard-IF-Anweisung ausführt.

Wenn Sie sich fragen, warum es die IIF-Funktion gibt, finden Sie hier möglicherweise eine Erklärung:

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

Der Zähler wird danach also 2 sein, aber s wird nur „JA“ sein.Ich weiß, dass dieses Zählerzeug nutzlos ist, aber manchmal gibt es Funktionen, für deren Ausführung Sie beide Funktionen benötigen, unabhängig davon, ob IF wahr oder falsch ist, und der Variablen einfach den Wert einer dieser Funktionen zuweisen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top