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?
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?
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);
Es scheint, dass sich die Leitlinien in diesem Bereich geändert haben könnten, da StyleCop erzwingt nun die Verwendung der C#-spezifischen Aliasnamen.
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.
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..
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.
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 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.