Czy istnieje różnica między następującymi dwoma częściami kodu?
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;
}
}
Odkryłem, że nasza baza kodu używa drugiego sposobu pisania.
Odpowiedzi:
Są tutaj dwa pytania i należy zauważyć, że mają one różne odpowiedzi.
Nie. Kompilator C # rozpoznaje, kiedy literał całkowity jest używany w kontekście, w którym spodziewane jest podwójne, i zmienia typ w czasie kompilacji, więc te dwa fragmenty wygenerują ten sam kod.
Tak. Zasada, że stałe liczb całkowitych są automatycznie zmieniane na liczby podwójne, dotyczy tylko stałych i
src ? ...
nie jest stała . Kompilator wygeneruje pierwszy tak, jakbyś napisał:A drugi jak
Oznacza to, że w pierwszej kolejności wybieramy liczbę całkowitą, a następnie przekształcamy ją na podwojoną, a w drugiej wybieramy podwójną.
Do waszej informacji: kompilator C # lub jitter mogą rozpoznać, że pierwszy program można zoptymalizować do drugiego, ale nie wiem, czy faktycznie to robi. C # kompilator jest czasem przejść konwersje podniesionym arytmetycznych w organach warunkowych; Napisałem ten kod jakieś osiem lat temu, ale nie pamiętam wszystkich szczegółów.
źródło
Jest to różnica w wygenerowanego kodu IL.
Ta klasa:
Tworzy ten kod IL dla konstruktora:
A ta klasa:
Tworzy ten kod IL dla konstruktora:
Jak widać, w pierwszej wersji musi on wywoływać
conv.r8
konwersję int na double.Jednak: (1) Wynik końcowy jest identyczny i (2) kompilator JIT może przetłumaczyć oba z nich na ten sam kod maszynowy.
Odpowiedź brzmi: tak, jest różnica - ale nie taka, o którą trzeba się martwić.
Osobiście wybrałbym drugą wersję, ponieważ lepiej wyraża ona zamiar programisty i może wygenerować bardzo, nieco bardziej wydajny kod (w zależności od tego, co porabia kompilator JIT).
źródło
Nie ma różnicy, kompilator jest wystarczająco inteligentny, aby pośrednio wykonać konwersję lub nie.
Jednak jeśli używasz
var
, musisz napisać,var val = 42D;
aby upewnić się, że zmienna jest podwójna, a nie int.źródło