Verursacht der VB.NET-Operator "If" Boxen?
Diejenigen von uns, die in VB / VB.NET gearbeitet haben, haben einen ähnlichen Code wie diesen gesehen:
Dim name As String = IIf(obj Is Nothing, "", obj.Name)
Ich sage "Greuel" aus drei einfachen Gründen:
IIf
ist einFunktion, deren Parameter alle ausgewertet werden; also wennobj
ist nix im obigen aufruf dann einNullReferenceException
wird geworfen. Dies ist ein unerwartetes Verhalten für jemanden, der an kurzgeschlossene ternäre Operatoren in Sprachen wie C # gewöhnt ist.weil IIf
Ist eine Funktion, so entsteht der Overhead eines Funktionsaufrufs. Obwohl dies keine große Sache ist, fühlt es sich für jemanden, der erwartet, dass es sich wie eine ternäre Operation verhält, die der Sprache eigen ist, einfach nicht richtig an.IIf
ist nicht generisch und akzeptiert daher Parameter vom TypObject
Dies bedeutet, dass die folgenden Callboxen (glaube ich) insgesamt drei ganze Zahlen enthalten:
' boxes 2nd and 3rd arguments as well as return value '
Dim value As Integer = IIf(condition, 1, -1)
Nun, in einer neueren Version von VB.NET (ich bin mir nicht sicher, wie die Nummer lautet), ist dieIf
Es wurde der Operator eingeführt, der genauso funktioniert wie derIIf
funktioniert aber (wie ich es verstehe) ohne die gleichen mängel. Das heißt estut Kurzschluss und esist eine intrinstische VB-Operation. Bei dem letzten Teil bin ich mir jedoch nicht sicher. DasMSDN-Dokumentation scheint nicht anzugeben, obIf
Boxen ihre Argumente oder nicht. Weiß jemand?