String und string in C#: Dasselbe oder nicht? Analyse mit Beispielen
\n\nWenn Sie jemals Code in C# geschrieben haben, ist Ihnen sicherlich aufgefallen, dass Zeichenketten auf zwei Arten deklariert werden können:
\n\nstring name = "Anna";\nString greeting = "Hallo!";\n\nUnd beide Varianten funktionieren. Es stellt sich die berechtigte Frage: Was ist der Unterschied zwischen string und String in C#? Sind es verschiedene Typen? Ist einer schneller? Oder ist es nur eine Marotte der Sprachentwickler?
\n\nSpoiler: Es gibt keinen Unterschied. Aber es ist nicht ganz so einfach, wie es auf den ersten Blick scheint. Lassen Sie uns das gründlich analysieren, damit Sie nicht nur die Antwort auf eine beliebte Stack Overflow-Frage kennen, sondern auch verstehen, warum es so gemacht wurde und welche Variante man in realen Projekten besser verwenden sollte.
\n\nKurze Antwort: string ist ein Alias für System.String
\n\nIn C# ist das Schlüsselwort string lediglich ein Alias für die Klasse System.String. Genauso wie int ein Alias für System.Int32 und bool ein Alias für System.Boolean ist.
Wenn der Compiler string sieht, setzt er automatisch System.String ein. Das bedeutet, dass beide Deklarationen zum selben IL-Code kompiliert werden:
// Diese beiden Zeilen sind auf IL-Ebene absolut identisch\nstring a = "Hallo";\nSystem.String b = "Welt";\n\nWenn Sie eine kompilierte .dll oder .exe mit ILSpy oder dotPeek öffnen, werden Sie keinen Unterschied zwischen diesen beiden Deklarationen finden.
\n\nAber warum gibt es dann beide Varianten?
\n\nHistorisch gesehen hat C# die Syntax von C/C++ geerbt, wo string kein Schlüsselwort, sondern eine Klasse ist. Die .NET-Entwickler entschieden sich, praktische Aliase hinzuzufügen, damit der Code natürlicher und für Programmierer aus anderen Sprachen vertrauter aussieht.
Außerdem benötigen die Aliase kein Einbinden des Namespace. Um String zu verwenden, müssen Sie entweder using System; hinzufügen oder den vollständigen Namen System.String schreiben. Bei string gibt es dieses Problem nicht – es ist immer verfügbar.
Wann string und wann String verwenden?
\n\nDie goldene Regel, die von den meisten Teams unterstützt wird und die Microsoft in der C#-Dokumentation empfiehlt:
\n\n- \n
- Verwenden Sie
stringbei der Deklaration von Variablen, Methodenparametern, Rückgabewerten – überall dort, wo dieses Schlüsselwort als Typ fungiert. \n - Verwenden Sie
Stringnur beim Zugriff auf statische Methoden der Klasse (z. B.String.IsNullOrEmpty()) oder bei der Verwendung vonSystem.Stringin den seltenen Fällen, in denen der Namespace explizit angegeben werden muss. \n
Warum das so ist? Weil string ein Sprachschlüsselwort ist, es wird in der IDE farblich hervorgehoben und es ist sofort klar, dass es sich um eine Zeichenkette handelt. String ist nur ein Klassenname und kann leichter mit anderen Klassen verwechselt werden.
Beispiel für guten Stil
\n\n// Variablendeklaration (string verwenden)\nstring userName = "Ivan";\n\n// Aufruf einer statischen Methode (String verwenden)\nif (String.IsNullOrEmpty(userName))\n{\n Console.WriteLine("Der Name darf nicht leer sein");\n}\n\n// Methodenparameter (string verwenden)\npublic void Greet(string name)\n{\n Console.WriteLine($"Hallo, {name}!");\n}\n\nGibt es einen Leistungsunterschied?
\n\nViele Entwickler fragen sich: Arbeitet string vielleicht schneller als String? Oder umgekehrt?
Antwort: Es gibt keinen Leistungsunterschied. Gar keinen. Absolut. Nach der Kompilierung werden beide Varianten zum gleichen IL-Code. Die Zeit, die für die Ausführung benötigt wird, ist identisch.