Was ist der Unterschied zwischen And und AndAlso in VB.NET?


Antworten:


380

Der AndBediener wertet beide Seiten aus, wobei AndAlsodie 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, AndAlsowie Sie es verwenden würden &&.

Weitere Infos hier: http://www.panopticoncentral.net/2003/08/18/the-ballad-of-andalso-and-orelse/


2
Der Link "Weitere Informationen" ist defekt. Hier ist die neue URL: panopticoncentral.net/2003/08/18/…
Rory O'Kane

12
Weiß jemand, warum er nicht stattdessen "AndThen" gewählt hat? Ich denke, das wäre intuitiver.
Allmächtiger

7
Ich habe immer gedacht, dass dies nicht intuitiv ist. Und auch würde bedeuten, dass es beide überprüfen wird und dies sollte umgekehrt sein! Deshalb muss ich zu SO kommen, um solche Dinge zu überprüfen (ja, ich bin ein AC # -Typ). Sie sollten auch niemals eine Frage wie "Unterschied zwischen And und AndAlso" stellen müssen. Zu viele ands! Mein Englischlehrer hätte mich getötet
Robin French

3
Immer wenn ich OrElse benutze, denke ich an South Park. "Oder was?" "Genau"
Robin French

1
@tmighty vermutet, dass es mehr Verwirrung stiften würde, weil Thenes sein eigenes Schlüsselwort ist.
Binki

29

Der AndOperator ü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 Andanstelle von verwendet würde AndAlso, würde es immer noch versuchen, Object.Load()selbst wenn es nothingwäre, was eine Ausnahme auslösen würde.


14
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.
Joel Coehoorn

1
Erstens wird Andalso nicht primär verwendet, um "Laufzeit zu sparen", das ist absurd. Zweitens ist es eine hässliche Praxis, wenn das zweite Argument einen nützlichen „Nebeneffekt“ ausführt.
Tor Haugen

2
Sie können jedoch nicht behaupten, dass es nicht zur Laufzeit spart. Und ich habe Situationen gefunden, in denen Nebenwirkungen tatsächlich keine hässliche schlechte Praxis sind.
Ed Marty

1
"Im Allgemeinen verwenden die Leute die Kurzschlussmethode, wenn es einen Grund gibt, den zweiten Teil explizit nicht zu überprüfen." Ähm, wut? Ich würde hoffen, dass die Leute Kurzschlüsse verwenden, es sei denn, sie haben einen Grund, dies nicht zu tun! Niemand sollte das Alte benutzen and/ es orsei 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 ...
underscore_d

20

Interessanterweise ist keine der Antworten erwähnt, dass Andund Orin VB.NET Bitoperatoren sind, während OrElseund AndAlsostreng 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 0wird eauf -1Demonstration gesetzt , Notist auch ein Bitoperator.

||und &&(die C # Versionen OrElseund AndAlso) Rückkehr den zuletzt ausgewerteten Ausdrucks , die sein würde 3und 5jeweils. Auf diese Weise können Sie das Idiom v || 5in C # verwenden, um 5den Wert des Ausdrucks als vis nulloder ( 0und eine Ganzzahl) und den Wert von velse 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 Orund Andfür Bitoperationen (Ganzzahl oder Boolescher Wert). Verwenden Sie OrElseund, AndAlsoum 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 thenoderif not (unsafe(evaluation) orelse (not evaluation)) then

Bonus: Was ist der Wert der folgenden?

Dim e = Not 0 And 3

Ich denke du bist verwirrt ||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)
Ben Voigt

14
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.


13

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 Andsichergestellt, dass bei jeder Überprüfung der Bedingung eine Zeile belegt wird. Während AndAlsokönnte die letzte Zeile von lesen File1und File2ohne 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.


5

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

3
Englisch ist verwirrender als Code, weil es keine Spezifikation hat!
Binki

5

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.


5

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, Andob 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.


3

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.


Erwähnenswert ist auch IIF (Immediate If), da es nicht kurzschließt und Bedingungen erzeugen kann, die der Absicht des Programmierers nicht entsprechen, da sowohl die wahre als auch die falsche Komponente ausgewertet werden. Früher gab jemand an, dass er dieses Nebenwirkungsverhalten absichtlich verwendet, aber - ich sehe dies nicht als wirksame Methode an, da das Sofort-If keine absichtliche Absicht hat, die Bewertung auf die Art und Weise durchzuführen, die ich erkennen kann.
Jinzai

"Zusätzlich zu den obigen Antworten bietet AndAlso einen Konditionierungsprozess, der als Kurzschluss bekannt ist." Jede Antwort über dieser konzentriert sich auf Kurzschlüsse. : P Aber gute Beschreibung und Empfehlungen.
underscore_d

1

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.


0

Mit Worten verstehen, nicht mit Cods:

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.