Was ist in VB.NET der Unterschied zwischen And
und AndAlso
? Welches soll ich verwenden?
vb.net
short-circuiting
Nakul Chaudhary
quelle
quelle
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:Überprüft, ob x gleich 5 ist und ob y gleich 7 ist, und fährt dann fort, wenn beide wahr sind.
Ü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:
Wenn das
And
anstelle von verwendet würdeAndAlso
, würde es immer noch versuchen,Object.Load()
selbst wenn esnothing
wäre, was eine Ausnahme auslösen würde.quelle
and
/ esor
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
undOr
in VB.NET Bitoperatoren sind, währendOrElse
undAndAlso
streng boolesche Operatoren sind.Hinweis : Eine Ganzzahl ungleich Null wird berücksichtigt
true
.Dim e = not 0
wirde
auf-1
Demonstration gesetzt ,Not
ist auch ein Bitoperator.||
und&&
(die C # VersionenOrElse
undAndAlso
) Rückkehr den zuletzt ausgewerteten Ausdrucks , die sein würde3
und5
jeweils. Auf diese Weise können Sie das Idiomv || 5
in C # verwenden, um5
den Wert des Ausdrucks alsv
isnull
oder (0
und eine Ganzzahl) und den Wert vonv
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
undAnd
für Bitoperationen (Ganzzahl oder Boolescher Wert). Verwenden SieOrElse
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?
quelle
||
und&&
mit??
. Während es Sprachen gibt, in denen||
der Nicht-Falsey-Wert zurückgegeben wird, ist C # keine davon und gibt a zurückbool
(mit Ausnahme von aufgehobenen nullbaren Operatoren, bei denen Sie einNullable<bool>
Ergebnis erhalten)Wertet sowohl Bool1 als auch Bool2 aus
Wertet Bool2 genau dann aus, wenn Bool1 wahr ist.
quelle
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.
Durch die Verwendung von wird
And
sichergestellt, dass bei jeder Überprüfung der Bedingung eine Zeile belegt wird. WährendAndAlso
könnte die letzte Zeile von lesenFile1
undFile2
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.
quelle
Eine einfache Möglichkeit, darüber nachzudenken, ist die Verwendung von noch einfacherem Englisch
quelle
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:
Die Verwendung des alten Und im obigen Ausdruck würde eine NullReferenceException auslösen, wenn myObj null wäre.
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle