Gibt es einen Unterschied zwischen den folgenden beiden Codeteilen?
class Test {
public readonly double Val;
public Test(bool src) {
this.Val = src ? 1 : 0;
}
}
class Test {
public readonly double Val;
public Test(bool src) {
this.Val = src ? 1D : 0D;
}
}
Ich fand heraus, dass unsere Codebasis die zweite Schreibweise verwendet.
Antworten:
Hier gibt es zwei Fragen, und es ist wichtig zu beachten, dass sie unterschiedliche Antworten haben.
Nein. Der C # -Compiler erkennt, wenn ein Ganzzahlliteral in einem Kontext verwendet wird, in dem ein Double erwartet wird, und ändert den Typ zur Kompilierungszeit, sodass diese beiden Fragmente denselben Code generieren.
Ja. Die Regel, dass ganzzahlige Konstanten automatisch in doppelte Konstanten geändert werden, gilt nur für Konstanten und
src ? ...
ist keine Konstante . Der Compiler generiert den ersteren so, als hätten Sie geschrieben:Und der zweite als
Das heißt, im ersten wählen wir eine Ganzzahl und konvertieren sie dann in double, und im zweiten wählen wir ein double.
Zu Ihrer Information: Der C # -Compiler oder der Jitter dürfen erkennen, dass das erste Programm in das zweite optimiert werden kann, aber ich weiß nicht, ob dies tatsächlich der Fall ist. Der C # Compiler hat manchmal Umwandlungen bewegen für hob in die Körper von conditionals Arithmetik; Ich habe diesen Code vor ungefähr acht Jahren geschrieben, aber ich erinnere mich nicht an alle Details.
quelle
Dort gibt einen Unterschied im generierten IL-Code.
Diese Klasse:
Erzeugt diesen IL-Code für den Konstruktor:
Und diese Klasse:
Erzeugt diesen IL-Code für den Konstruktor:
Wie Sie sehen können, muss es in der ersten Version aufgerufen werden
conv.r8
, um ein int in ein double zu konvertieren.Jedoch: (1) Das Endergebnis ist identisch und (2) der JIT-Compiler kann beide in denselben Maschinencode übersetzen.
Die Antwort lautet also: Ja, das gibt es einen Unterschied - aber keinen, über den Sie sich Sorgen machen müssen.
Persönlich würde ich mich für die zweite Version entscheiden, da dies die Absicht des Programmierers besser zum Ausdruck bringt und möglicherweise einen sehr etwas effizienteren Code erzeugt (abhängig davon, was der JIT-Compiler vorhat).
quelle
Es gibt keinen Unterschied, der Compiler ist intelligent genug, um implizit eine Konvertierung durchzuführen oder nicht.
Wenn Sie jedoch verwenden
var
, müssen Sie schreibenvar val = 42D;
, um sicherzustellen, dass die Variable ein Double und kein Int ist.quelle