stringvs. Stringnie jest debatą stylową
[...]
Słowo kluczowe stringma konkretne znaczenie w języku C #. Jest to typ, System.Stringktó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 stringma precyzyjne, jednoznaczne znaczenie w kodzie C #.
Identyfikator Stringnie ma jednak konkretnego znaczenia w języku C #. Jest to identyfikator, który przechodzi przez wszystkie reguły wyszukiwania nazw jako Widget, Studentitp. 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 Stringzawsze 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 Stringi stringzwiąże się z tego samego typu. Ale używanie Stringnadal oznacza, że programiści pozostawiają swój program do interpretacji w miejscach, gdzie jest tylko jedna poprawna odpowiedź. Kiedy Stringwiąż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 Stringjest w porządku, ponieważ niezwykle rzadko podstawa kodu definiuje typ tej nazwy. Lub, gdy Stringjest zdefiniowany, jest to znak złej bazy kodu.
[...]
Zobaczysz, że Stringjest 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 Stringvs. stringma realne konsekwencje w zależności od tego, gdzie jest używany kod.
Więc pamiętaj, kiedy widzisz debatę Stringkontra vs. stringdotyczy semantyki, a nie stylu. Wybór ciągu nadaje wyraźne znaczenie twojej bazie kodu. Wybór Stringnie 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 .
stringjest to leksykalna konstrukcja gramatyki C #, podczas gdySystem.Stringjest 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ćstringw taki sposób, aby implementacja nie była (całkiem) tak zobowiązana do rozważenia dla konkretnej klasy w BCL.