Was ist in VB.NET der Unterschied zwischen And
und AndAlso
? Welches soll ich verwenden?
Was ist in VB.NET der Unterschied zwischen And
und AndAlso
? Welches soll ich verwenden?
Antworten:
Der And
Bediener wertet beide Seiten aus, wobei AndAlso
die rechte Seite genau dann ausgewertet wird, wenn die linke Seite wahr ist.
Ein Beispiel:
If mystring IsNot Nothing And mystring.Contains("Foo") Then
' bla bla
End If
Das obige löst eine Ausnahme aus, wenn mystring = Nothing
If mystring IsNot Nothing AndAlso mystring.Contains("Foo") Then
' bla bla
End If
Dieser löst keine Ausnahme aus.
Wenn Sie also aus der C # -Welt kommen, sollten Sie verwenden, AndAlso
wie Sie es verwenden würden &&
.
Weitere Infos hier: http://www.panopticoncentral.net/2003/08/18/the-ballad-of-andalso-and-orelse/
Then
es sein eigenes Schlüsselwort ist.
Der And
Operator überprüft alle Bedingungen in der Anweisung, bevor er fortfährt, während der Andalso-Operator stoppt, wenn er weiß, dass die Bedingung falsch ist. Beispielsweise:
if x = 5 And y = 7
Überprüft, ob x gleich 5 ist und ob y gleich 7 ist, und fährt dann fort, wenn beide wahr sind.
if x = 5 AndAlso y = 7
Überprüft, ob x gleich 5 ist. Wenn dies nicht der Fall ist, wird nicht überprüft, ob y 7 ist, da bekannt ist, dass die Bedingung bereits falsch ist. (Dies wird als Kurzschluss bezeichnet.)
Im Allgemeinen verwenden Benutzer die Kurzschlussmethode, wenn es einen Grund gibt, den zweiten Teil explizit nicht zu überprüfen, wenn der erste Teil nicht wahr ist, z. B. wenn er bei Prüfung eine Ausnahme auslösen würde. Beispielsweise:
If Not Object Is Nothing AndAlso Object.Load()
Wenn das And
anstelle von verwendet würde AndAlso
, würde es immer noch versuchen, Object.Load()
selbst wenn es nothing
wäre, was eine Ausnahme auslösen würde.
and
/ es or
sei denn, er hat einen Grund - von dem ich denke, dass es nur wenige legitime gibt. Sicherlich gibt es einen Grund, warum die meisten anderen Sprachen standardmäßig kurzschließen: Sie behalten den Sinn des Ergebnisses bei, ohne potenziell kostspielige Ausdrücke auszuwerten, wenn sie nichts beitragen. Das Verstauen von Nebenwirkungen unter bestimmten Bedingungen sollte mit den Augen erfolgen. Aber das ist nur meine Meinung ...
Interessanterweise ist keine der Antworten erwähnt, dass And
und Or
in VB.NET Bitoperatoren sind, während OrElse
und AndAlso
streng boolesche Operatoren sind.
Dim a = 3 OR 5 ' Will set a to the value 7, 011 or 101 = 111
Dim a = 3 And 5 ' Will set a to the value 1, 011 and 101 = 001
Dim b = 3 OrElse 5 ' Will set b to the value true and not evaluate the 5
Dim b = 3 AndAlso 5 ' Will set b to the value true after evaluating the 5
Dim c = 0 AndAlso 5 ' Will set c to the value false and not evaluate the 5
Hinweis : Eine Ganzzahl ungleich Null wird berücksichtigt true
. Dim e = not 0
wird e
auf -1
Demonstration gesetzt , Not
ist auch ein Bitoperator.
||
und &&
(die C # Versionen OrElse
und AndAlso
) Rückkehr den zuletzt ausgewerteten Ausdrucks , die sein würde 3
und 5
jeweils. Auf diese Weise können Sie das Idiom v || 5
in C # verwenden, um 5
den Wert des Ausdrucks als v
is null
oder ( 0
und eine Ganzzahl) und den Wert von v
else anzugeben. Der Unterschied in der Semantik kann dazu führen, dass ein C # -Programmierer unvorbereitet in VB.NET herumfummelt, da diese "Standardwertsprache" in VB.NET nicht funktioniert.
Um die Frage zu beantworten : Verwenden Sie Or
und And
für Bitoperationen (Ganzzahl oder Boolescher Wert). Verwenden Sie OrElse
und, AndAlso
um einen Vorgang kurzzuschließen, um Zeit zu sparen, oder testen Sie die Gültigkeit einer Bewertung, bevor Sie sie bewerten. If valid(evaluation) andalso evaluation then
oderif not (unsafe(evaluation) orelse (not evaluation)) then
Bonus: Was ist der Wert der folgenden?
Dim e = Not 0 And 3
||
und &&
mit ??
. Während es Sprachen gibt, in denen ||
der Nicht-Falsey-Wert zurückgegeben wird, ist C # keine davon und gibt a zurück bool
(mit Ausnahme von aufgehobenen nullbaren Operatoren, bei denen Sie ein Nullable<bool>
Ergebnis erhalten)
If Bool1 And Bool2 Then
Wertet sowohl Bool1 als auch Bool2 aus
If Bool1 AndAlso Bool2 Then
Wertet Bool2 genau dann aus, wenn Bool1 wahr ist.
Nur für all jene Menschen, die sagen, dass Nebenwirkungen böse sind: Ein Ort, an dem zwei Nebenwirkungen in einem Zustand gut sind, ist das gleichzeitige Lesen von zwei Dateiobjekten.
While File1.Seek_Next_Row() And File2.Seek_Next_Row()
Str1 = File1.GetRow()
Str2 = File2.GetRow()
End While
Durch die Verwendung von wird And
sichergestellt, dass bei jeder Überprüfung der Bedingung eine Zeile belegt wird. Während AndAlso
könnte die letzte Zeile von lesen File1
und File2
ohne eine verbrauchte Zeile verlassen.
Natürlich würde der obige Code nicht funktionieren, aber ich benutze die ganze Zeit solche Nebenwirkungen und würde ihn nicht als " schlechten " oder " bösen " Code betrachten, da manche Sie glauben machen würden. Es ist leicht zu lesen und effizient.
Eine einfache Möglichkeit, darüber nachzudenken, ist die Verwendung von noch einfacherem Englisch
If Bool1 And Bool2 Then
If [both are true] Then
If Bool1 AndAlso Bool2 Then
If [first is true then evaluate the second] Then
AndAlso ist ähnlich wie And, außer dass es wie && in C #, C ++ usw. funktioniert.
Der Unterschied besteht darin, dass, wenn die erste Klausel (die vor AndAlso) wahr ist, die zweite Klausel niemals ausgewertet wird - der zusammengesetzte logische Ausdruck ist "kurzgeschlossen".
Dies ist manchmal sehr nützlich, z. B. in einem Ausdruck wie:
If Not IsNull(myObj) AndAlso myObj.SomeProperty = 3 Then
...
End If
Die Verwendung des alten Und im obigen Ausdruck würde eine NullReferenceException auslösen, wenn myObj null wäre.
Siehe auch Frage zum Stapelüberlauf : Soll ich immer die Operatoren AndAlso und OrElse verwenden? .
Außerdem: Ein Kommentar für diejenigen, die erwähnt haben, And
ob die rechte Seite des Ausdrucks eine Nebenwirkung hat, die Sie benötigen:
Wenn die rechte Seite einen Nebeneffekt hat, den Sie benötigen, verschieben Sie ihn einfach auf die linke Seite, anstatt "Und" zu verwenden. Sie brauchen "Und" nur dann wirklich, wenn beide Seiten Nebenwirkungen haben. Und wenn Sie so viele Nebenwirkungen haben, machen Sie wahrscheinlich etwas anderes falsch. Im Allgemeinen sollten Sie AndAlso wirklich bevorzugen.
Zusätzlich zu den obigen Antworten bietet AndAlso einen Konditionierungsprozess, der als Kurzschluss bekannt ist. In vielen Programmiersprachen ist diese Funktionalität wie in vb.net integriert, und bei langen Bedingungsanweisungen können erhebliche Leistungssteigerungen erzielt werden, indem nicht erforderliche Auswertungen ausgeschlossen werden.
Eine andere ähnliche Bedingung ist die OrElse-Bedingung, die die rechte Bedingung nur dann überprüft, wenn die linke Bedingung falsch ist, wodurch unnötige Zustandsprüfungen vermieden werden, nachdem eine wahre Bedingung gefunden wurde.
Ich würde Ihnen raten, immer Kurzschlussprozesse zu verwenden und Ihre bedingten Aussagen so zu strukturieren, dass dies am meisten davon profitiert. Testen Sie beispielsweise zuerst Ihre effizientesten und schnellsten Bedingungen, damit Sie Ihre langen Bedingungen nur dann ausführen, wenn Sie die anderen Zeiten unbedingt benötigen und kurzschließen müssen.
Für die meisten von uns werden OrElse und AndAlso den Trick machen, bis auf einige verwirrende Ausnahmen (weniger als 1%, wenn wir Or oder And verwenden müssen).
Versuchen Sie, sich nicht von Leuten mitreißen zu lassen, die ihre boolesche Logik zeigen und sie wie eine Raketenwissenschaft aussehen lassen.
Es ist recht einfach und unkompliziert, und gelegentlich funktioniert Ihr System möglicherweise nicht wie erwartet, da es Ihre Logik überhaupt nicht mag. Und doch sagt Ihnen Ihr Gehirn immer wieder, dass seine Logik zu 100% getestet und bewiesen ist und funktionieren sollte. Hören Sie in diesem Moment auf, Ihrem Gehirn zu vertrauen, und bitten Sie ihn, erneut nachzudenken, oder (nicht OrElse oder vielleicht OrElse) Sie zwingen sich, nach einem anderen Job zu suchen, der nicht viel Logik erfordert.
Anwendungsfall:
Mit "Und" überprüft der Compiler alle Bedingungen. Wenn Sie also überprüfen, ob ein Objekt "Nichts" sein könnte, und dann eine seiner Eigenschaften überprüfen, wird ein Laufzeitfehler angezeigt.
Aber mit AndAlso mit dem ersten "false" in den Bedingungen wird das nächste überprüft, damit Sie keinen Fehler haben.