7523 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?

7055voto

Derek Park Punkte 44820

string ist ein Alias in C# für System.String .
Technisch gesehen gibt es also keinen Unterschied. Es ist wie int vs. System.Int32 .

Was die Leitlinien betrifft, so wird allgemein empfohlen, Folgendes zu verwenden string immer dann, wenn Sie sich auf ein Objekt beziehen.

z.B..

string place = "world";

Ebenso ist es meiner Meinung nach allgemein empfehlenswert, die String wenn Sie sich speziell auf die Klasse beziehen müssen.

z.B..

string greet = String.Format("Hello {0}!", place);

Dies ist der von Microsoft in der Regel verwendete Stil für ihre Beispiele .

Es scheint, dass sich die Leitlinien in diesem Bereich geändert haben könnten, da StyleCop erzwingt nun die Verwendung der C#-spezifischen Aliasnamen.

3806voto

Jon Skeet Punkte 1325502

Nur der Vollständigkeit halber hier ein Brain Dump mit verwandten Informationen...

Wie andere bereits festgestellt haben, string ist ein Alias für System.String . Angenommen, Ihr Code verwendet String kompiliert zu System.String (d.h. Sie haben keine using-Direktive für einen anderen Namespace mit einem anderen String Typ), werden sie zu demselben Code kompiliert, so dass es zur Ausführungszeit keinerlei Unterschied gibt. Dies ist nur einer der Aliasnamen in C#. Die vollständige Liste ist:

object:  System.Object
string:  System.String
bool:    System.Boolean
byte:    System.Byte
sbyte:   System.SByte
short:   System.Int16
ushort:  System.UInt16
int:     System.Int32
uint:    System.UInt32
long:    System.Int64
ulong:   System.UInt64
float:   System.Single
double:  System.Double
decimal: System.Decimal
char:    System.Char

Abgesehen von string et object sind die Aliasnamen alle auf Werttypen bezogen. decimal ist ein Werttyp, aber kein primitiver Typ in der CLR. Der einzige primitive Typ, der keinen Alias hat, ist System.IntPtr .

In der Spezifikation werden die Werttyp-Aliase als "einfache Typen" bezeichnet. Literale können für konstante Werte jedes einfachen Typs verwendet werden; für keine anderen Wertetypen sind literale Formen verfügbar. (Vergleichen Sie dies mit VB, das erlaubt DateTime Literale, und hat auch einen Alias dafür).

Es gibt einen Umstand, unter dem Sie haben die Aliasnamen zu verwenden: wenn der zugrundeliegende Typ einer Enum explizit angegeben wird. Zum Beispiel:

public enum Foo : UInt32 {} // Invalid
public enum Bar : uint   {} // Valid

Das ist nur eine Frage der Art und Weise, wie die Spezifikation Enum-Deklarationen definiert - der Teil nach dem Doppelpunkt muss die Integral-Typ Produktion, die ein Zeichen für sbyte , byte , short , ushort , int , uint , long , ulong , char ... im Gegensatz zu einer Typ Produktion, wie sie zum Beispiel bei Variablendeklarationen verwendet wird. Ein anderer Unterschied ist nicht erkennbar.

Schließlich, wenn es darum geht, welche zu verwenden: persönlich verwende ich die Aliase überall für die Umsetzung, aber die CLR-Typ für alle APIs. Es ist wirklich nicht so wichtig, was Sie in Bezug auf die Implementierung verwenden - Konsistenz in Ihrem Team ist schön, aber es wird niemanden sonst interessieren. Andererseits ist es wirklich wichtig, dass Sie, wenn Sie in einer API auf einen Typ verweisen, dies auf eine sprachneutrale Weise tun. Eine Methode namens ReadInt32 ist eindeutig, während eine Methode namens ReadInt erfordert Interpretation. Der Aufrufer könnte eine Sprache verwenden, die eine int alias für Int16 zum Beispiel. Die Entwickler des .NET-Frameworks sind diesem Muster gefolgt, gute Beispiele sind die BitConverter , BinaryReader et Convert Klassen.

831voto

artur02 Punkte 4401

String steht für System.String und es ist ein .NET Framework-Typ. string ist ein Alias in der Sprache C# für System.String . Beide sind kompiliert zu System.String in IL (Zwischensprache), es gibt also keinen Unterschied. Wählen Sie, was Ihnen gefällt, und verwenden Sie es. Wenn Sie in C# programmieren, würde ich Folgendes bevorzugen string da es sich um einen C#-Typ-Alias handelt, der C#-Programmierern gut bekannt ist.

Das Gleiche kann ich sagen über ( int , System.Int32 ) usw..

591voto

Luke Foust Punkte 2224

Die beste Antwort, die ich je über die Verwendung der bereitgestellten Typ-Aliase in C# gehört habe, stammt von Jeffrey Richter in seinem Buch CLR über C# . Hier sind seine 3 Gründe:

  • Ich habe eine Reihe von Entwicklern gesehen, die verwirrt waren und nicht wussten, ob sie die String ou Zeichenfolge in ihrem Code. Da in C# die Zeichenkette (ein Schlüsselwort) genau auf System.String (ein FCL-Typ) abgebildet wird, gibt es keinen Unterschied und beide können verwendet werden.
  • 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 long als eine Int32 . Jemand, der Quellcode in einer Sprache liest, könnte die Absicht des Codes leicht falsch 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. Zum Beispiel ist 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, fühlt sich die Zeile mit float für mich sehr unnatürlich an, und es ist nicht offensichtlich, dass die Zeile korrekt ist:
BinaryReader br = new BinaryReader(...);
float val  = br.ReadSingle(); // OK, but feels unnatural
Single val = br.ReadSingle(); // OK and feels good

Da haben Sie es also. Ich denke, das sind alles sehr gute Punkte. Ich finde mich jedoch nicht mit Jeffrey's Ratschläge in meinem eigenen Code. Vielleicht bin ich zu sehr in meiner C#-Welt verhaftet, aber am Ende versuche ich, meinen Code wie den Framework-Code aussehen zu lassen.

525voto

Simon_Weaver Punkte 129442

string ist ein reserviertes Wort, aber String ist nur ein Klassenname. Das bedeutet, dass string kann nicht selbst als Variablenname verwendet werden.

Wenn Sie aus irgendeinem Grund eine Variable namens String sehen Sie nur die erste dieser Kompilierungen:

StringBuilder String = new StringBuilder();  // compiles
StringBuilder string = new StringBuilder();  // doesn't compile 

Wenn Sie wirklich einen Variablennamen namens String können Sie @ als Präfix:

StringBuilder @string = new StringBuilder();

Ein weiterer entscheidender Unterschied: Stack Overflow hebt sie unterschiedlich hervor.

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