Frage

Ich habe mir viele Beiträge/Artikel über die Verwendung von Iif() angesehen.All dies begann, als ich versuchte, IIf() wie einen bedingten Operator zu verwenden, ähnlich wie C/C#/C++ usw.

Was ich genau versucht habe, entsprach genau den Zeilen des folgenden Beitrags:

Bei Verwendung von VB.NET IIF erhalte ich eine NullReferenceException

Die von mir implementierte Lösung wurde jedoch von der folgenden MSDN-Site ausgeliehen:

http://msdn.microsoft.com/en-us/library/27ydhh0d%28v=vs.80%29.aspx

Erst danach habe ich etwas über die If()-Methode in vb.net erfahren.

Am Ende hatte ich also eine Funktion geschrieben, die den entsprechenden Wert zurückgibt (wobei Reflektion verwendet wurde), um den Zweck zu erreichen.Aber diese Methode (die ich geschrieben habe) hat keine Ausnahme ausgelöst.Tatsächlich konnte ich die Nullfähigkeit des Typs innerhalb der Funktion überprüfen.

Function ReturnValue(ByVal MyType As SomeType, ByVal PropertyName as String) As Object
    If MyType Is Nothing Then Return String.Empty
    Dim arrPropInfo As PropertyInfo() = MyType.GetType().GetProperties()
    Return arrPropInfo.Where(Function(x) x.Name = PropertyName).Item(0).GetValue(MyType, Nothing)
End Function

Meine Frage ist, ist in Iif() etwas geschrieben, das einen solchen Fehler auslöst?– eine NullReferenceException

If MyType Is Nothing Then Throw New NullReferenceException()

Oder ist hier etwas viel Größeres am Werk?Angenommen, ich wollte eine Funktion wie iif schreiben, die einen Fehler auslöst, wenn etwas in der Argumentliste null ist. Ist die oben beschriebene Methode die einzige Möglichkeit, dies zu tun?

War es hilfreich?

Lösung

Der Unterschied besteht darin ?: Und If() Sind Betreiber. IIf() ist kein Operator;Es ist eine einfache alte Funktion.Sie können es sogar selbst umsetzen:

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

Das bedeutet, dass alle an die Funktion übergebenen Argumente ausgewertet werden müssen Vor Die Funktion wird wie jede andere Funktion aufgerufen.Es gibt nichts in IIF(), das eine Ausnahme auslöst – es ist lediglich der normale Prozess der Auswertung von Argumenten, die an eine Funktion übergeben werden.

Sie müssen auch beachten, dass es vollkommen in Ordnung ist, null/Nothing an eine Funktion zu übergeben.Sie haben die Ausnahme in Ihrem Code gesehen, weil der von Ihnen übergebene Ausdruck einen Nullverweis hatte, der nicht ausgewertet werden konnte. Wenn Sie beispielsweise so etwas getan haben, versuchen Sie, die .Length-Eigenschaft einer Null-String-Variablen zu verwenden.

Der If()-Operator hingegen hat dieses Problem nicht, weil es einfach so ist:Ein Operator Darüber hinaus ist es ein Operator, der die Kurzschlussauswertung nutzt, sodass nur der zurückgegebene Ausdruck ausgewertet werden muss.If() hat auch den schönen Vorteil, dass es typsicher ist, obwohl Sie die Typsicherheit bei Bedarf auch in einer generischen IIF(Of T)()-Funktion replizieren könnten.

Andere Tipps

IIF unterscheidet sich von C++ :?Zumindest in einer wichtigen Hinsicht werden immer beide Ausdrücke ausgewertet, sodass Sie beispielsweise keine Aktionen ausführen können IIF(X is nothing,DefaultValue,X.Value).Es wird eine Nullreferenzausnahme ausgelöst, da X.Value trotzdem ausgewertet wird, wenn X nichts ist.

IIF funktioniert so, weil es eine Funktion und kein Operator ist

Sie haben keinen Code für die Verwendung von IIF angegeben, also rate ich nur.Was ich gerade gesagt habe, ist der allererste Kommentar zu dem Link, den Sie zu MSDN bereitgestellt haben. Es ist also wahrscheinlich, dass Sie dies bereits wussten oder dass dies nicht Ihre Frage ist.

Wenn Ihre Frage wirklich darin besteht, dass Sie eine Ausnahme auslösen möchten, sollten Sie den oben aufgeführten Code verwenden, aber „and“ auslösen ArgumentNullException Stattdessen können Sie angeben, welches Argument null war.

Sie können ein zusätzliches BYREF-Argument hinzufügen, um anzuzeigen, ob in der Funktion tatsächlich eine Ausnahme erfolgt.Auf diese Weise können wir die Notwendigkeit beseitigen, eine in der Funktion erhöhte Ausnahme zu fangen.Natürlich müssen Sie versuchen, versuchen Sie ... Fang-Anweisungen in dieser Funktion.

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