Um ein bisschen klarer zu sein, werde ich sagen, dass ich viel Zeit mit verschiedenen Sprachen verbracht habe. Aber bis jetzt wurde es entweder die ganze Zeit verwendet oder es unterstützt es überhaupt nicht.
Jetzt arbeite ich an Projekten, für die VB.net erforderlich ist, und ich sehe, dass es in Bezug auf AND und ANDALSO beide Möglichkeiten bietet . Der erste schließt nicht kurz und der zweite nicht.
Das führt mich zu der Frage, warum? Wenn es so eingerichtet ist, scheint dies zu bedeuten, dass es ziemlich oft vorkommt, dass man den Modus wechseln möchte. Aber ich kann mir keine Situationen vorstellen, in denen es schlecht wäre, Kurzschluss zu verwenden .
Ich weiß, dass dies sehr gut zu einer Option werden könnte. Wenn ich dies also an einem anderen Ort platzieren muss, sag mir einfach, wo.
Obwohl ich hoffe, dass es zumindest eine offizielle Antwort gibt, warum es besser wäre, beide Optionen zu haben, als immer einen Kurzschluss zu machen , wenn er verfügbar ist.
quelle
Antworten:
Einige Begriffe in einem logischen Ausdruck können Nebenwirkungen haben. Manchmal muss sichergestellt werden, dass alle Nebenwirkungen in der angegebenen Reihenfolge auftreten und keine übersprungen werden. Das Bewertungsergebnis leitet die Logik:
In anderen Fällen möchten Sie keinen der verbleibenden Begriffe bewerten, wenn eine frühere Bewertung false zurückgibt.
Einige werden / haben argumentiert, dass es eine schlechte Form ist, sich auf das Kurzschlussverhalten im zweiten Beispiel zu verlassen, aber das führt zu Codierungsstil und Glaubenssystemen. Es gibt viele sehr gute Code-Teile auf der Welt, die sich auf fast alle Funktionen einer Sprache stützen, und so ist es auch.
ANDALSO von VB ist knackig und scheint ein Versuch zu sein, die Praxis akzeptabler zu machen.
Wie JimmyJames in seiner Antwort hervorhebt, kann die Kurzschlussbewertung messbare Auswirkungen auf die Leistung haben. Sprachen, die den Mechanismus nicht bereitstellen, bewerten immer jeden Begriff des Ausdrucks, während diejenigen, die ihn bereitstellen, zusätzliche Verzweigungsanweisungen generieren können. In beiden Fällen hängt vieles von der Anzahl der Verarbeitungsschritte ab, die zur Bewertung der einzelnen Begriffe erforderlich sind, sowie von der Compiler- und CPU-Architektur. Normalerweise interessieren Sie sich nicht für solche Dinge, bis Sie einen gemessenen Engpass im Code haben und herausfinden müssen, wie Sie diesen beheben können. Alle Do or Do-Regeln zum Zulassen einer Kurzschlussauswertung in Ihrem Code haben ungefähr die gleiche Wahrscheinlichkeit, langsameren Code zu verursachen, und eine frühzeitige Optimierung kann eine totale Zeitverschwendung sein. Messen Sie also immer und optimieren Sie dann.
quelle
if
Zustand überprüfen und trotzdem kurzschließen. Ich stimme zu, dass es in gewisser Weise eine stilistische Unterscheidung ist, aber es hat die Tugend, die Dinge kristallklar zu machen.Anscheinend geht es bei Ihrer Frage nicht darum, ob ein Kurzschluss im Allgemeinen gut oder schlecht ist, sondern darum, warum VB.NET Betreibern mit und ohne diesen Kurzschluss zur Verfügung stellt. In diesem Sinne die Antwort auf
ist einfach: wenn es die Abwärtskompatibilität verletzt .
Ok, jetzt können Sie sagen, dass VB.NET nicht sehr abwärtskompatibel mit altem VB6 oder VBA ist, jedoch zumindest bestimmte Teile der Sprache. Die Entscheidung von Microsoft, die alte UND- und ODER-Semantik (ohne Kurzschluss) beizubehalten, führte dazu, dass beim Portieren alter VB-Programme nach VB.NET eine große Fehlerkategorie weniger wahrscheinlich auftrat.
Auf der anderen Seite haben VB.NET-Sprachdesigner wahrscheinlich Ihre Meinung darüber geteilt, dass Kurzschlüsse eine gute Sache sind. Wenn ich mich richtig erinnere, versorgten die ersten VB.NET-Vorabversionen AND- oder OR-Operatoren mit Kurzschlüssen, aber das Feedback der Entwickler muss so schlecht gewesen sein, dass MS diese Entscheidung zurückzog, bevor VB.NET 1.0 erschien. Daher haben die Designer beschlossen, es in Bezug auf neue Schlüsselwörter
ANDALSO
undORELSE
als Kompromiss zwischen Abwärtskompatibilität und Nützlichkeit zu implementieren .IMHO war das eine gute Entscheidung. Ich musste im letzten Jahrzehnt mehrere ältere Programme portieren, und nicht für jeden logischen Ausdruck, einschließlich UND und / oder ODER (Wortspiel beabsichtigt), eine Analyse der Auswirkungen durchführen zu müssen, machte diese Aufgabe viel einfacher und wirtschaftlicher. Wenn ich andererseits einen neuen logischen Ausdruck in VB.NET schreiben muss, sind meine Standardauswahl für die Operatoren die Kurzschlussformen, wie ich es von C, C ++, C # usw. gewohnt bin, und es erlaubt Ich schreibe mehrere Redewendungen in prägnanterer Form (auch wenn ANDALSO 4 Zeichen mehr zum Tippen benötigt).
Wenn Sie nicht überzeugt sind, empfehle ich, Joel Spolskys großartigen Artikel über Martian Headsets zu lesen. Deshalb können frühe Entwurfsentscheidungen in der Softwareentwicklung nicht einfach widerrufen werden, nachdem die betreffende Komponente, Sprache oder API eine Benutzerbasis einer bestimmten Größe erreicht hat .
quelle
And
Operation weder kurzgeschlossen, noch in SQL (1974), FORTRAN (1956) oder Pascal (1970).Sie werden schlecht , sobald Sie sich auf Nebenwirkungen von Ausdrücken verlassen, von denen Sie erwarten, dass sie bei der Bewertung eines booleschen Gesamtergebnisses ausgeführt werden.
quelle
Vorsichtsmaßnahme : Dies ist insofern etwas esoterisch, als Entwickler sich in fast allen Fällen keine Sorgen machen sollten. Aber ... aufgrund der bedingten Auswertung kann es zu Leistungseinbußen kommen, da bei der Ausführung Verzweigungen auftreten. Eine nicht kurzschließende Operation verzweigt sich nicht und ist vorhersehbarer.
Der Grund, warum dies selten von Bedeutung ist, ist, dass die Kosten typischerweise gering sind und normalerweise auch durch die Kosten für die Bewertung der zweiten (oder dritten usw.) Bedingung aufgewogen werden. Dies ist in rechenintensiven Routinen immer dann nur dann von Bedeutung, wenn eine hohe Leistung erforderlich ist, und es spielt dann möglicherweise auch noch keine Rolle.
quelle
Pascal hat nicht definiert, ob UND und ODER Kurzschlussauswertung verwenden oder nicht, was Ihnen das Schlimmste aus beiden Welten gibt.
C und C ++ haben bitweise Operationen & und | die Ihnen in der Praxis nicht kurzschließen. Und Compiler können nach Belieben bewerten, ob dies keinen erkennbaren Unterschied macht.
quelle