Was ist der Unterschied zwischen oder und OrElse ?
if temp is dbnull.value or temp = 0
erzeugt den Fehler:
Der Operator '=' ist nicht für den Typ 'DBNull' und den Typ 'Integer' definiert.
während dieser wie ein Zauber wirkt!?
if temp is dbnull.value OrElse temp = 0
Dies ist das gleiche Verhalten wie bei C #, wo jeder das Coditional Or (||) und das Conditional And (&&) verwendet, wobei Sie auch das normale Or (|) und das normale And (&) haben. Der Vergleich von C # mit VB.Net lautet also:
| => Or. En
|| => OrElse
& => Und
&& => AndAlso
Die bedingten booleschen Operatoren sind sehr nützlich, um verschachtelte if-Konstruktionen zu verhindern. Manchmal werden jedoch die normalen booleschen Operatoren benötigt, um sicherzustellen, dass beide Codepfade getroffen werden.
quelle
|
und&
sind bitweise Operatoren in C #, überhaupt keine booleschen Operationen.OrElse ist kurzgeschlossen . Dies bedeutet, dass nur eine Seite des Ausdrucks getestet wird, wenn die erste Seite übereinstimmt.
Genau wie AndAlso wird nur eine Seite des Ausdrucks getestet, wenn die erste Hälfte fehlschlägt.
quelle
(Ich habe mir andere Antworten angesehen und festgestellt, dass ich mich schrecklich geirrt habe.)
Der OrElse-Operator "führt eine logische Kurzschluss-Disjunktion für zwei Ausdrücke durch", dh: Wenn der linke Operand wahr ist und somit garantiert wird, dass der gesamte Ausdruck wahr ist, wird der rechte Operand nicht einmal ausgewertet (dies ist nützlich in Fälle wie:
um einen NullReferenceException-Wurf durch den rechten Operanden zu vermeiden.
Ich bin aufrichtig erstaunt, dass dies ( verzögerte Auswertung ) nicht das Standardverhalten von
or
undand
wie in C / C ++ und C # (und vielen anderen Sprachen ...) ist.quelle
OrElse wertet den ersten Ausdruck aus. Wenn er wahr ist, wird mit der Anweisung fortgefahren, während OR zwei Ausdrücke auswertet, bevor mit der Anweisung fortgefahren wird.
Beispiel:
Verwenden von OrElse
Ergebnis ist: WAHR
Verwenden von OR
Ergebnis ist: Fehler kann String nicht in Double konvertieren.
quelle
Die Antwort von Bert ist nicht sehr genau. Das '|' oder '&' ist ein logischer Operator, in C # wird er immer als Bitoperator behandelt. Den folgenden Code finden Sie als Beispiel
Das Folgende ist IL
wenn Sie || verwenden Um "a == null" und "a.ToString () ==" sdffd "zu testen, wird die IL sein
Jetzt können Sie den Unterschied sehen, denken Sie bitte nicht an das '|' oder 'und' als bedingter Operator, es ist nur ein logischer Operator, ich glaube nicht, dass es notwendig ist, ihn zur Beurteilung der Bedingung zu verwenden
quelle
The '|' or '&' is logical operator, in C #, it always treat as bit operator
. Ich habe auch daran geglaubt, bis ich diese Referenz sah, msdn.microsoft.com/en-us/library/kxszd0kx.aspxSofern Ihre Codelogik nicht das von OrElse bereitgestellte Kurzschlussverhalten erfordert, würde ich den Operator Or verwenden, weil:
quelle
Der Grund, warum die Kompilierung im Beispiel fehlschlägt, ist die Reihenfolge der Operationen.
Der Ausdrucksparser versucht zuerst, "dbnull.value or temp" auszuwerten.
Der Fehler ist hier, weil Sie kein bitweises ODER zwischen einer Ganzzahl (temp) und dbnull.value ausführen können.
OrElse behebt dies nicht, weil es kurzgeschlossen ist, sondern weil es in der Reihenfolge der Operationen niedriger ist. Daher werden zuerst "temp is dbnull.value" und "3 = 0" ausgewertet, anstatt dass der Parser versucht, dbNull und zu vergleichen temp.
Die Auswertung mit OrElse funktioniert also wie erwartet: (Temp = 3 annehmen)
Dies war tatsächlich eine Aufnahmeprüfung bei einem Softwareunternehmen, für das ich früher gearbeitet habe, und es war ein häufiges Problem, auf das ich in VB6 gestoßen bin. Es ist daher eine gute Idee, Ihre Unterausdrücke in Klammern zu setzen, wenn Sie boolesche Operatoren verwenden:
Dies hätte richtig kompiliert:
Obwohl, wie alle bereits betont haben, OrElse und AndAlso in diesem Zusammenhang wirklich die richtigen Operatoren sind.
quelle