string
vs. String
nie jest debatą stylową
[...]
Słowo kluczowe string
ma konkretne znaczenie w języku C #. Jest to typ, System.String
który istnieje w podstawowym zestawie wykonawczym. Środowisko wykonawcze w pełni rozumie ten typ i zapewnia możliwości, których twórcy oczekują od ciągów w .NET. Jego obecność jest tak ważna dla C #, że jeśli ten typ nie istnieje, kompilator zakończy działanie przed próbą nawet parsowania linii kodu. Stąd string
ma precyzyjne, jednoznaczne znaczenie w kodzie C #.
Identyfikator String
nie ma jednak konkretnego znaczenia w języku C #. Jest to identyfikator, który przechodzi przez wszystkie reguły wyszukiwania nazw jako Widget
, Student
itp. Może wiązać się z łańcuchem lub z innym typem zestawu, którego cele mogą być zupełnie inne niż string
. Co gorsza, można go zdefiniować w taki sposób, jak kod String s = "hello"
; kontynuował kompilację.
class TricksterString {
void Example() {
String s = "Hello World"; // Okay but probably not what you expect.
}
}
class String {
public static implicit operator String(string s) => null;
}
Rzeczywiste znaczenie String
zawsze będzie zależeć od rozpoznawania nazw. Oznacza to, że zależy to od wszystkich plików źródłowych w projekcie i wszystkich typów zdefiniowanych we wszystkich zestawach, do których istnieją odniesienia. Krótko mówiąc, potrzeba sporo kontekstu, aby wiedzieć, co to znaczy.
To prawda, że w zdecydowanej większości przypadków String
i string
zwiąże się z tego samego typu. Ale używanie String
nadal oznacza, że programiści pozostawiają swój program do interpretacji w miejscach, gdzie jest tylko jedna poprawna odpowiedź. Kiedy String
wiąże się z niewłaściwym typem, może programistom debugować godzinami, zgłaszać błędy w zespole kompilatora i generalnie marnować czas, który można by zaoszczędzić, używając string
.
Innym sposobem na zwizualizowanie różnicy jest użycie tej próbki:
string s1 = 42; // Errors 100% of the time
String s2 = 42; // Might error, might not, depends on the code
Wielu będzie argumentować, że chociaż informacje te są technicznie dokładne, używanie String
jest w porządku, ponieważ niezwykle rzadko podstawa kodu definiuje typ tej nazwy. Lub, gdy String
jest zdefiniowany, jest to znak złej bazy kodu.
[...]
Zobaczysz, że String
jest zdefiniowany dla szeregu całkowicie ważnych celów: pomocników refleksji, bibliotek serializacji, leksykonów, protokołów itp. Dla każdej z tych bibliotek String
vs. string
ma realne konsekwencje w zależności od tego, gdzie jest używany kod.
Więc pamiętaj, kiedy widzisz debatę String
kontra vs. string
dotyczy semantyki, a nie stylu. Wybór ciągu nadaje wyraźne znaczenie twojej bazie kodu. Wybór String
nie jest zły, ale pozostawia otwarte drzwi dla niespodzianek w przyszłości.
Uwaga: skopiowałem / wkleiłem większość postów na blogu z przyczyn archiwalnych. Ignoruję niektóre części, więc jeśli to możliwe , polecam pominąć i przeczytać post na blogu .
string
jest to leksykalna konstrukcja gramatyki C #, podczas gdySystem.String
jest tylko typem. Bez względu na jakąkolwiek wyraźną różnicę wymienioną w jakiejkolwiek specyfikacji, nadal istnieje ta domniemana różnica, którą można przyjąć z pewną dwuznacznością. Sam język musi obsługiwaćstring
w taki sposób, aby implementacja nie była (całkiem) tak zobowiązana do rozważenia dla konkretnej klasy w BCL.