string
vs. String
ist kein Stil Debatte
[...]
Das Schlüsselwort string
hat in C # eine konkrete Bedeutung. Dies ist der Typ, System.String
der in der Kernlaufzeitassembly vorhanden ist. Die Laufzeit versteht diesen Typ uneingeschränkt und bietet die Funktionen, die Entwickler für Zeichenfolgen in .NET erwarten. Das Vorhandensein ist für C # so wichtig, dass der Compiler beendet wird, wenn dieser Typ nicht vorhanden ist, bevor er versucht, eine Codezeile zu analysieren. Hat daher string
eine genaue, eindeutige Bedeutung im C # -Code.
Der Bezeichner String
hat jedoch in C # keine konkrete Bedeutung. Es ist ein Bezeichner, wie durch alle Namen - Suche Regeln geht Widget
, Student
usw ... Es könnte zu bespannen binden oder es könnte als in einer anderen Baugruppe vollständig , deren Zweck sein kann , ganz anders als ein Typ binden string
. Schlimmer noch, es könnte so definiert werden, dass Code wie String s = "hello"
; weiter kompilieren.
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;
}
Die tatsächliche Bedeutung von String
wird immer von der Namensauflösung abhängen. Das heißt, es hängt von allen Quelldateien im Projekt und allen Typen ab, die in allen Assemblys definiert sind, auf die verwiesen wird. Kurz gesagt, es erfordert einiges an Kontext, um zu wissen, was es bedeutet.
Richtig, dass in den allermeisten Fällen String
und string
wird an den gleichen Typ binden. Die Verwendung von String
Still bedeutet jedoch, dass Entwickler ihr Programm der Interpretation an Orten überlassen, an denen es nur eine richtige Antwort gibt. Wenn String
die Bindung an den falschen Typ erfolgt, können Entwickler stundenlang debuggen, Fehler im Compilerteam melden und im Allgemeinen Zeit verschwenden, die durch die Verwendung hätte eingespart werden können string
.
Eine andere Möglichkeit, den Unterschied zu visualisieren, ist dieses Beispiel:
string s1 = 42; // Errors 100% of the time
String s2 = 42; // Might error, might not, depends on the code
Viele werden argumentieren, dass die Verwendung technisch korrekter Informationen String
immer noch in Ordnung ist, da es äußerst selten vorkommt, dass eine Codebasis einen Typ dieses Namens definiert. Oder wenn String
es definiert ist, ist es ein Zeichen für eine schlechte Codebasis.
[...]
Sie werden sehen , dass String
für eine Reihe von vollständig gültig Zwecke definiert ist: Reflexion Helfer, Serialisierung Bibliotheken, lexers, Protokolle, etc ... Für jede dieser Bibliotheken String
vs. string
hat reale Folgen je nachdem , wo der Code verwendet wird.
Denken Sie also daran, wenn Sie die String
vs.- string
Debatte sehen, geht es um Semantik, nicht um Stil. Wenn Sie eine Zeichenfolge auswählen, erhält Ihre Codebasis eine klare Bedeutung. Die Wahl String
ist nicht falsch, lässt aber die Tür für Überraschungen in der Zukunft offen.
Hinweis: Ich habe den größten Teil des Blogposts aus Archivgründen kopiert / eingefügt. Ich ignoriere einige Teile, daher empfehle ich, den Blog-Beitrag zu überspringen und zu lesen, wenn Sie können.
string
es sich um ein lexikalisches Konstrukt der C # -Grammatik handelt, währendSystem.String
es sich nur um einen Typ handelt. Unabhängig von einem expliziten Unterschied, der in einer Spezifikation erwähnt wird, gibt es immer noch diesen impliziten Unterschied, der mit einer gewissen Mehrdeutigkeit einhergehen könnte. Die Sprache selbst muss so unterstützt werdenstring
, dass die Implementierung nicht (ganz) verpflichtet ist, für eine bestimmte Klasse in der BCL zu berücksichtigen.