Zamierzam dodać przykład teraz, aby zilustrować jak kompilator traktuje dwa, ponieważ nie wydaje się być LOT zamieszanie w niektórych innych odpowiedzi (edit: pamiętać, że wiele z tych nieporozumień zostały usunięte/edytowane away):
bool value = true;
int channel = 1;
String s = String.Format(":Channel{0}:Display {1}", channel,
value ? "ON" : "OFF");
ostatnia linia jest kompilowany jako:
String s = String.Format(":Channel{0}:Display {1}",
new object[2] {(object)channel, value ? "ON" : "OFF")};
nocie co ciekawe stworzenia tablicy i „box” dla int channel
i oczywiście dodatkowe przetwarzanie wymagane do znalezienia {0}
/{1}
.
teraz Numer 2:
bool value = true;
String channel = "1";
string s = ":Channel" + channel + ":Display " + (value ? "ON" : "OFF");
Ostatni wiersz jest kompilowany jako:
string s = string.Concat(":Channel", channel, ":Display ", value ? "ON" : "OFF");
tutaj nie ma żadnej tablicy, no box (channel
jest ciągiem), a nie analizowania. Przeciążenie to public static string string.Concat(string,string,string,string)
; string.Concat
jest zaimplementowany bardzo wydajnie, wstępnie przypisuje odpowiedni ciąg znaków z wyprzedzeniem, a następnie nadpisywanie itp.
W większości przypadków kod jest w porządku. Druga wersja jest bardziej wydajna pod względem technicznym (bez ramki, bez tablic, bez analizowania), ale jest poważnym problemem, jeśli chcesz później umiędzynarodowić. W większości aplikacji nie zauważysz żadnej różnicy między nimi. Przetwarzanie jest szybkie, a pole/tablica są zbierane tanio jako obiekty zerowe. Ale tanie nie jest darmowe.
Zdaję sobie sprawę, że zadaję prawie niemożliwe, ale DLACZEGO nie próbowałeś się zmierzyć? – zerkms
Czy zidentyfikowałeś to jako problem z wydajnością? Wybierz bardziej czytelny (IMO 'Format') –
Dlaczego spadki? To przyzwoite pytanie (nawet gdybyś mógł je zmierzyć sam, oto, może pomóc innym). –