Gibt es in c # einen Unterschied in der Ausführungsgeschwindigkeit für die Reihenfolge, in der Sie die Bedingung angeben?
if (null != variable) ...
if (variable != null) ...
Seit kurzem habe ich das erste ziemlich oft gesehen, und es hat meine Aufmerksamkeit erregt, seit ich an das zweite gewöhnt war.
Wenn es keinen Unterschied gibt, was ist der Vorteil des ersten?
c#
coding-style
mr_georg
quelle
quelle
Antworten:
Es ist ein Überbleibsel von C. Wenn Sie in C entweder einen schlechten Compiler verwenden oder die Warnungen nicht hoch genug sind, wird dies ohne jegliche Warnung kompiliert (und ist in der Tat ein gesetzlicher Code):
als du eigentlich wohl gemeint hast
Sie können dies in C umgehen, indem Sie Folgendes tun:
Ein Tippfehler hier führt zu ungültigem Code.
Nun, in C # ist das alles piffle. Wenn Sie nicht zwei Boolesche Werte vergleichen (was selten vorkommt, IME), können Sie den besser lesbaren Code schreiben, da für eine "if" -Anweisung zunächst ein Boolescher Ausdruck erforderlich ist und der Typ "
x=5
"Int32
nichtBoolean
.Ich schlage vor, wenn Sie dies im Code Ihrer Kollegen sehen, erziehen Sie sie in modernen Sprachen und schlagen vor, dass sie in Zukunft die natürlichere Form schreiben.
quelle
else { }
Klausel anzugeben, falls jemand dort später etwas hinzufügen muss und vergisst, daselse
Schlüsselwort selbst zu schreiben . (Witz)Es gibt einen guten Grund, zuerst null zu verwenden:
if(null == myDuck)
Wenn Sie
class Duck
den==
Operator überschreiben ,if(myDuck == null)
können Sie in eine Endlosschleife gehen.Bei der
null
ersten Verwendung wird ein Standard-Gleichstellungskomparator verwendet, der tatsächlich das tut, was Sie beabsichtigt haben.(Ich habe gehört, dass Sie sich daran gewöhnt haben, Code zu lesen, der irgendwann so geschrieben wurde - ich habe diese Transformation noch nicht erlebt).
Hier ist ein Beispiel:
quelle
==
Bediener und legen Sie ihn dort ab. In beiden Fällen wird die benutzerdefinierte Überlastung verwendet. Natürlich kann es einen subtilen Unterschied machen, wenn Siea
vorher prüfenb
und dann die Position desa
rechten Operanden zum linken Operanden vertauschen . Sie könnten aber auchb
vorher nachsehena
, und dannb == null
wäre es derjenige, der die Reihenfolge umgekehrt hat. Dies ist alles verwirrend, wenn sich der Bediener selbst anruft. Wirken Sie stattdessen einen der Operanden (oder beide)object
, um die gewünschte Überladung zu erhalten. Wieif ((object)a == null)
oderif (a == (object)null)
.Wie alle bereits bemerkt haben, kommt es mehr oder weniger aus der C-Sprache, wo Sie falschen Code erhalten könnten, wenn Sie versehentlich das zweite Gleichheitszeichen vergessen. Es gibt aber noch einen anderen Grund, der auch mit C # übereinstimmt: Lesbarkeit.
Nehmen Sie einfach dieses einfache Beispiel:
Wenn Sie einfach alle Nullwörter an den Anfang tauschen würden , könnten Sie alle Überprüfungen viel einfacher erkennen:
Dieses Beispiel ist vielleicht ein schlechtes Beispiel (siehe Codierungsrichtlinien), aber denken Sie nur daran, dass Sie schnell über eine vollständige Codedatei scrollen. Indem Sie einfach das Muster sehen
Sie wissen sofort, was als nächstes kommt.
Wenn es umgekehrt wäre, müssen Sie immer bis zum Ende der Zeile scannen , um die Nichtigkeitsprüfung zu sehen, und Sie müssen nur eine Sekunde lang stolpern, um herauszufinden, welche Art von Prüfung dort durchgeführt wird. Vielleicht hilft Ihnen die Hervorhebung der Syntax, aber Sie sind immer langsamer, wenn sich diese Schlüsselwörter am Ende der Zeile anstatt am Anfang befinden.
quelle
Ich denke, dies ist ein C-Programmierer, der die Sprache gewechselt hat.
In C können Sie Folgendes schreiben:
Beachten Sie die Verwendung eines einzelnen Gleichheitszeichens, was bedeutet, dass der Code der Variablen i 1 zuweist, dann 1 zurückgibt (eine Zuweisung ist ein Ausdruck) und 1 in der if-Anweisung verwendet, die als wahr behandelt wird. Mit anderen Worten, das Obige ist ein Fehler.
In C # ist dies jedoch nicht möglich. Es gibt in der Tat keinen Unterschied zwischen den beiden.
quelle
In früheren Zeiten vergaßen die Leute das '!' (oder das zusätzliche '=' für Gleichheit, das schwieriger zu erkennen ist) und führen Sie eine Zuweisung anstelle eines Vergleichs durch. Wenn Sie die Null voranstellen, wird die Möglichkeit für den Fehler ausgeschlossen, da null kein l-Wert ist (IE kann ihm nicht zugewiesen werden).
Die meisten modernen Compiler geben heutzutage eine Warnung aus, wenn Sie eine Zuweisung unter bestimmten Bedingungen ausführen, und C # gibt tatsächlich einen Fehler aus. Die meisten Leute halten sich einfach an das Schema var == null, da es für manche Leute einfacher zu lesen ist.
quelle
Ich sehe keinen Vorteil darin, dieser Konvention zu folgen. In C, wo es keine booleschen Typen gibt, ist es nützlich zu schreiben
eher, als
denn wenn Sie eines der Gleichheitszeichen vergessen, erhalten Sie am Ende
Dies weist der Variablen 5 zu und wertet immer true aus. In Java ist ein Boolescher Wert ein Boolescher Wert. Und mit! = Gibt es überhaupt keinen Grund.
Ein guter Rat ist jedoch zu schreiben
eher, als
weil es hilft, NullPointerExceptions zu vermeiden.
Mein Rat wäre, um eine Begründung der Regel zu bitten. Wenn es keine gibt, warum dann folgen? Es hilft nicht die Lesbarkeit
quelle
Für mich war es immer der Stil, den Sie bevorzugen
@Shy - Wenn Sie die Operatoren verwirren, sollten Sie einen Kompilierungsfehler erhalten, oder Sie führen Code mit einem Fehler aus - einem Fehler, der zurückkommt und Sie später beißt, da er unerwartetes Verhalten hervorruft
quelle
Wie viele betonten, wurde es hauptsächlich in altem C-Code verwendet, um Kompilierungsfehler zu identifizieren, da der Compiler dies als legal akzeptierte
Neue Programmiersprachen wie Java, go sind intelligent genug, um solche Kompilierungsfehler zu erfassen
Man sollte keine "null! = Variablen" -ähnlichen Bedingungen im Code verwenden, da diese sehr unlesbar sind
quelle
Noch etwas ... Wenn Sie eine Variable mit einer Konstanten vergleichen (z. B. Ganzzahl oder Zeichenfolge), empfiehlt es sich, die Konstante links zu setzen, da Sie nie auf NullPointerExceptions stoßen:
wohingegen
Da C # standardmäßig alle Variablen instanziiert, sollte dieses Problem in dieser Sprache nicht auftreten.
quelle
i
handelt sich um einen zufälligen Wert ohne ordnungsgemäße Initialisierung. Der Ausdruck hat völlig die gleiche Semantik in c / c ++