7569 Stimmen

Was ist der Unterschied zwischen String und String in C#?

Beispiel ( den Fall beachten ):

string s = "Hello world!";
String s = "Hello world!";

Wie lauten die Leitlinien für die Verwendung der einzelnen Mittel? Und was sind die Unterschiede?

94voto

Ich möchte nur noch folgendes zu lfousts Antwort hinzufügen, aus Ritchers Buch:

In der C# Sprachspezifikation heißt es: "Aus stilistischen Gründen wird die Verwendung des Schlüsselworts bevorzugt gegenüber Verwendung des vollständigen Systemtypnamens." Ich stimme mit der Sprachspezifikation nicht überein; ich bevorzuge Ich ziehe es vor, die FCL-Typnamen zu verwenden und die primitiven Typnamen vollständig zu vermeiden. Ich wünschte sogar, dass Compiler die primitiven Typnamen gar nicht erst anbieten und die Entwickler zwingen, stattdessen die FCL Typennamen zu verwenden. Hier sind meine Gründe:

  • Ich habe eine Reihe von Entwicklern gesehen, die verwirrt waren und nicht wussten, ob sie die String oder Zeichenfolge in ihrem Code. Denn in C# String (ein Schlüsselwort) entspricht genau der System.String (ein FCL-Typ), gibt es keinen Unterschied und beide können verwendet werden. Ähnlich, habe ich einige Entwickler sagen hören, dass int steht für eine 32-Bit-Ganzzahl, wenn die Anwendung eine 32-Bit-Ganzzahl darstellt, wenn die Anwendung auf einem 32-Bit-Betriebssystem läuft, und eine 64-Bit-Ganzzahl darstellt, wenn die Anwendung auf einem 64-Bit-Betriebssystem ausgeführt wird. Diese Aussage ist absolut falsch: In C# ist eine int immer Karten auf System.Int32 und stellt daher eine 32-Bit-Ganzzahl dar, unabhängig vom Betriebssystem, das die Code ausgeführt wird. Wenn Programmierer Int32 in ihrem Code, dann ist diese potenzielle Verwirrung ebenfalls beseitigt.

  • In C#, lang Karten zu System.Int64 , aber in einer anderen Programmiersprache, lang könnte auf eine Int16 ou Int32 . In der Tat behandelt C++/CLI lang als Int32 . Jemand, der Quellcode in einer Sprache liest, könnte die Absicht des Codes leicht falsch interpretieren interpretieren, wenn er oder sie an die Programmierung in einer anderen Programmiersprache gewöhnt ist. In der Tat behandeln die meisten Sprachen nicht einmal lang als Schlüsselwort und kompiliert keinen Code der es verwendet.

  • Die FCL hat viele Methoden, die Typnamen als Teil ihrer Methodennamen haben. Für zum Beispiel die BinaryReader Typ bietet Methoden wie ReadBoolean , ReadInt32 , ReadSingle und so weiter, und die System.Konvertieren Typ bietet Methoden wie ToBoolean , ToInt32 , ToSingle , und so weiter. Obwohl es legal ist, den folgenden Code zu schreiben Code zu schreiben, ist die Zeile mit Schwimmer fühlt sich für mich sehr unnatürlich an, und es ist nicht offensichtlich, dass die Linie korrekt ist. richtig ist:

    BinaryReader br = new BinaryReader(...);
    float val = br.ReadSingle(); // OK, but feels unnatural
    Single val = br.ReadSingle(); // OK and feels good
  • Viele Programmierer, die ausschließlich C# verwenden, neigen dazu zu vergessen, dass andere Programmiersprachen Sprachen gegen die CLR verwendet werden können, und so schleichen sich C#-ismen in den Code der Code der Klassenbibliothek ein. Microsofts FCL ist zum Beispiel fast ausschließlich in C# geschrieben und Entwickler des FCL-Teams haben nun Methoden in die Bibliothek eingeführt, wie z. B. Array 's GetLongLength die ein Int64 Wert, der ein lang in C#, aber nicht in anderen Sprachen (wie C++/CLI). Ein weiteres Beispiel ist System.Linq.Enumerable 's LongCount Methode.

Ich habe seine Meinung nicht verstanden, bevor ich den ganzen Absatz gelesen habe.

83voto

Joe Alfano Punkte 9859

Zeichenfolge ( System.String ) ist eine Klasse in der Basisklassenbibliothek. string (kleingeschrieben) ist eine reservierte Arbeit in C#, die ein Alias für System.String ist. Int32 vs int ist eine ähnliche Situation wie Boolean vs. bool . Mit diesen C#-spezifischen Schlüsselwörtern können Sie Primitive in einem ähnlichen Stil wie in C deklarieren.

83voto

aloisdg Punkte 18811

@JaredPar (ein Entwickler des C#-Compilers und produktiver SO-Nutzer!) schrieb eine toller Blogbeitrag zu diesem Thema. Ich denke, es lohnt sich, sie hier zu teilen. Es ist eine schöne Perspektive auf unser Thema.

string vs. String ist keine Stildebatte

[...]

Das Schlüsselwort string hat in C# eine konkrete Bedeutung. Es ist der Typ System.String die in der Core-Runtime-Assembly vorhanden ist. Die Laufzeitumgebung versteht diesen Typ von Haus aus und bietet die Funktionen, die Entwickler für Strings in .NET erwarten. Das Vorhandensein dieses Typs ist für C# so wichtig, dass der Compiler bei Nichtvorhandensein dieses Typs abbricht, bevor er auch nur versucht, eine Codezeile zu parsen. Daher string hat im C#-Code eine präzise, eindeutige Bedeutung.

Die Kennung String hat jedoch keine konkrete Bedeutung in C#. Es ist ein Bezeichner, der alle Regeln der Namenssuche durchläuft wie Widget , Student usw. Es könnte an eine Zeichenkette gebunden sein oder an einen Typ in einer völlig anderen Assembly, deren Zweck möglicherweise ein völlig anderer ist als string . Schlimmer noch, es könnte so definiert werden, dass Code wie String s = "hello" ; kompilierte weiter.

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 eigentliche Bedeutung von String wird immer von der Namensauflösung abhängen. Das bedeutet, dass sie von allen Quelldateien im Projekt und allen Typen ab, die in allen referenzierten Assemblies definiert sind. Kurz gesagt, es erfordert eine ganze Menge Kontext, um wissen was es bedeutet.

Es stimmt, dass in der großen Mehrheit der Fälle String et string wird gebunden an denselben Typ. Aber mit String bedeutet immer noch, dass die Entwickler abwandern ihr Programm an Stellen, an denen es nur eine richtige Antwort gibt, der Interpretation richtige Antwort gibt. Wenn String an den falschen Typ gebunden ist, kann es zu Entwickler stundenlang debuggen, Fehler an das Compiler-Team melden und generell Zeit verschwenden, die man durch die Verwendung von string .

Eine weitere Möglichkeit, den Unterschied zu verdeutlichen, 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 diese Informationen zwar technisch korrekt sind und String ist immer noch in Ordnung, weil es äußerst selten ist, dass eine Codebasis einen Typ mit diesem Namen definiert. Oder dass, wenn String definiert ist, ist das ein Zeichen für eine schlechte Codebasis.

[...]

Sie werden sehen, dass String ist für eine Reihe von völlig zulässigen Zwecken definiert: Reflection-Helfer, Serialisierungsbibliotheken, Lexer, Protokolle usw. Für jede dieser Bibliotheken String vs. string hat reale Konsequenzen, je nachdem, wo der Code verwendet wird.

Denken Sie also daran, wenn Sie die String vs. string In dieser Debatte geht es um Semantik, nicht um Stil. Die Wahl von string gibt Ihrer Codebasis eine klare Bedeutung. Die Wahl von String ist nicht falsch, aber es lässt die Tür für Überraschungen in der Zukunft offen.

Hinweis: Ich habe die meisten Blogbeiträge aus Archivgründen kopiert und eingefügt. Einige Teile ignoriere ich, daher empfehle ich, die Beiträge zu überspringen und die Blogbeitrag wenn Sie können.

80voto

Mel Punkte 2137

Das ist eigentlich eine Frage der Konvention. string sieht einfach mehr nach C/C++ aus. Die allgemeine Konvention ist es, die Abkürzungen zu verwenden, die Ihre gewählte Sprache zur Verfügung stellt (int/Int für Int32 ). Dies gilt für "Objekt" und decimal auch.

Theoretisch könnte dies helfen, Code in einen zukünftigen 64-Bit-Standard zu portieren, in dem "int" bedeuten könnte Int64 aber das ist nicht der Punkt, und ich würde erwarten, dass jeder Upgrade-Assistent alle int Verweise auf Int32 nur um sicher zu gehen.

78voto

user576533 Punkte 91

String ist kein Schlüsselwort und kann als Bezeichner verwendet werden, während string ist ein Schlüsselwort und kann nicht als Bezeichner verwendet werden. Und in Bezug auf die Funktion sind beide gleich.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X