Was ist der Unterschied zwischen String und String in C#?
Frage
Beispiel (Beachten Sie den Fall):
string s = "Hello world!";
String s = "Hello world!";
Was sind die Richtlinien für den Gebrauch von jedem?Und was sind die Unterschiede?
Lösung
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 Richtlinien angeht, wird die Verwendung generell empfohlen string
immer wenn Sie sich auf ein Objekt beziehen.
z.B.
string place = "world";
Ebenso denke ich, dass die Verwendung generell empfohlen wird String
wenn Sie sich speziell auf die Klasse beziehen müssen.
z.B.
string greet = String.Format("Hello {0}!", place);
Dies ist der Stil, den Microsoft tendenziell verwendet ihre Beispiele.
Es scheint, dass sich die Leitlinien in diesem Bereich möglicherweise geändert haben StyleCop Erzwingt jetzt die Verwendung der C#-spezifischen Aliase.
Andere Tipps
Der Vollständigkeit halber finden Sie hier einen Braindump mit relevanten Informationen ...
Wie andere angemerkt haben, string
ist ein Alias für System.String
.Sie kompilieren mit demselben Code, sodass es zur Ausführungszeit keinerlei Unterschiede gibt.Dies ist nur einer der Aliase in C#.Die vollständige Liste lautet:
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
Außer, abgesondert, ausgenommen string
Und object
, die Aliase beziehen sich alle auf Werttypen. 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 andere Werttypen stehen keine Literalformen zur Verfügung.(Vergleichen Sie dies mit VB, das ermöglicht DateTime
Literale und hat auch einen Alias dafür.)
Es gibt einen Umstand, in dem Sie haben Um die Aliase zu verwenden:wenn explizit der zugrunde liegende Typ einer Aufzählung 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 der sein Integraltyp Produktion, die ein Zeichen dafür ist sbyte
, byte
, short
, ushort
, int
, uint
, long
, ulong
, char
...im Gegensatz zu a Typ Produktion, wie sie beispielsweise von Variablendeklarationen verwendet wird.Es weist auf keinen weiteren Unterschied hin.
Zum Schluss, was Sie verwenden sollten:Persönlich verwende ich die Aliase überall für die Implementierung, aber den CLR-Typ für alle APIs.Im Hinblick auf die Implementierung spielt es keine allzu große Rolle, was Sie verwenden – Konsistenz innerhalb Ihres Teams ist schön, aber niemanden sonst wird sich darum kümmern.Andererseits ist es wirklich wichtig, dass Sie, wenn Sie in einer API auf einen Typ verweisen, dies sprachneutral tun.Eine Methode namens ReadInt32
ist eindeutig, wohingegen eine aufgerufene Methode ReadInt
erfordert Interpretation.Der Anrufer könnte eine Sprache verwenden, die eine definiert int
Alias für Int16
, Zum Beispiel.Die .NET-Framework-Designer sind diesem Muster gefolgt, gute Beispiele finden sich im BitConverter
, BinaryReader
Und Convert
Klassen.
String
steht für System.String
und es ist ein .NET Framework-Typ. string
ist ein Alias in der C#-Sprache für System.String
.Beide sind kompiliert System.String
in IL (Mittelstufe), daher gibt es keinen Unterschied.Wählen Sie, was Ihnen gefällt, und verwenden Sie es.Wenn Sie in C# programmieren, würde ich es vorziehen string
da es sich um einen Alias vom Typ C# handelt und C#-Programmierern wohlbekannt ist.
Das Gleiche kann ich auch sagen (int
, System.Int32
) usw..
Die beste Antwort, die ich je über die Verwendung der bereitgestellten Typaliase 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 verwirrt gesehen, die nicht wussten, ob sie es verwenden sollten Zeichenfolge oder Zeichenfolge in ihrem Code.Da in C# die Zeichenfolge (ein Schlüsselwort) genau System.String (einem FCL-Typ) zugeordnet ist, 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 einem zuordnen Int16 oder Int32.Tatsächlich behandelt C++/CLI long als Int32.Jemand, der Quellcode in einer Sprache liest, könnte die Absicht des Codes leicht falsch interpretieren, wenn er oder sie es gewohnt wäre, in einer anderen Programmiersprache zu programmieren.Tatsächlich behandeln die meisten Sprachen sie nicht einmal lang als Schlüsselwort und kompiliert keinen Code, der es verwendet.
- Die FCL verfügt über viele Methoden, deren Methodennamen Typnamen enthalten.Zum Beispiel die BinaryReader Typ bietet Methoden wie ReadBoolean, ReadInt32, ReadSingle, und so weiter, und die System.Convert Typ bietet Methoden wie ToBoolean, ToInt32, ZuSingle, und so weiter.Obwohl es legal ist, den folgenden Code zu schreiben, kommt mir die Zeile mit Float sehr unnatürlich vor 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 wirklich gute Punkte.Allerdings verwende ich Jeffreys Rat nicht in meinem eigenen Code.Vielleicht stecke ich zu sehr in meiner C#-Welt fest, 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 allein als Variablenname verwendet werden.
Wenn Sie aus irgendeinem Grund eine Variable namens haben möchten Zeichenfolge, würden Sie nur die erste dieser Kompilierungen sehen:
StringBuilder String = new StringBuilder(); // compiles
StringBuilder string = new StringBuilder(); // doesn't compile
Wenn Sie wirklich einen Variablennamen namens möchten Zeichenfolge Sie können verwenden @
als Präfix:
StringBuilder @string = new StringBuilder();
Ein weiterer entscheidender Unterschied:Stack Overflow hebt sie unterschiedlich hervor.
Es gibt einen Unterschied - Sie können es nicht verwenden String
ohne using System;
vorweg.
Es wurde oben behandelt;Sie können es jedoch nicht verwenden string
im Nachdenken;Sie müssen verwenden String
.
System.String
ist die .NET-String-Klasse – in C# string
ist ein Alias für System.String
- im Gebrauch sind sie also gleich.
Was die Richtlinien angeht, würde ich mich nicht zu sehr verzetteln und einfach das verwenden, worauf Sie Lust haben – es gibt wichtigere Dinge im Leben und der Code wird sowieso derselbe sein.
Wenn Sie Systeme erstellen, bei denen es notwendig ist, die Größe der von Ihnen verwendeten Ganzzahlen anzugeben, und die Sie daher tendenziell verwenden Int16
, Int32
, UInt16
, UInt32
usw.Dann sieht die Verwendung möglicherweise natürlicher aus String
- und beim Wechseln zwischen verschiedenen .net-Sprachen könnte es die Dinge verständlicher machen - ansonsten würde ich string und int verwenden.
Ich bevorzuge die Großschreibung .NET
aus Formatierungsgründen nur Typen (und nicht Aliase) verwenden.Der .NET
Typen haben die gleiche Farbe wie andere Objekttypen (die Werttypen sind schließlich richtige Objekte).
Bedingte und Kontrollschlüsselwörter (wie if
, switch
, Und return
) sind kleingeschrieben und dunkelblau (standardmäßig).Und ich möchte lieber keine Meinungsverschiedenheiten in Bezug auf Verwendung und Format haben.
Halten:
String someString;
string anotherString;
string
Und String
sind in jeder Hinsicht identisch (außer dem Großbuchstaben „S“).Es gibt in beiden Fällen keine Auswirkungen auf die Leistung.
Kleinbuchstaben string
wird aufgrund der Syntaxhervorhebung in den meisten Projekten bevorzugt
C# ist eine Sprache, die zusammen mit der CLR verwendet wird.
string
ist ein Typ in C#.
System.String
ist ein Typ in der CLR.
Wenn Sie C# zusammen mit der CLR verwenden string
wird zugeordnet System.String
.
Theoretisch könnten Sie einen C#-Compiler implementieren, der Java-Bytecode generiert.Eine sinnvolle Implementierung dieses Compilers würde wahrscheinlich zuordnen string
Zu java.lang.String
um mit der Java-Laufzeitbibliothek zu interagieren.
Dieses YouTube Das Video zeigt praktisch, wie sie sich unterscheiden.
Nun aber zu einer langen Textantwort.
Wenn wir darüber reden .NET
Es gibt zwei verschiedene Dinge .NET
Framework und das andere gibt es Sprachen ( C#
, VB.NET
usw.), die dieses Framework verwenden.
"System.String
" auch bekannt als „String“ (Großbuchstabe „S“) ist ein .NET
Framework-Datentyp, während „string“ ein ist C#
Datentyp.
Kurz gesagt ist „String“ ein Alias (das Gleiche mit unterschiedlichen Namen) von „string“.Technisch gesehen liefern beide folgenden Codeanweisungen die gleiche Ausgabe.
String s = "I am String";
oder
string s = "I am String";
Auf die gleiche Weise gibt es Aliase für andere C#-Datentypen, wie unten gezeigt:-
Objekt: System.Object
, Zeichenfolge: System.String
, bool: System.Boolean
, Byte: System.Byte
, sbyte: System.SByte
, kurz: System.Int16
und so weiter
Nun die Millionen-Dollar-Frage aus Sicht des Programmierers. Wann werden also „String“ und „String“ verwendet?
Um Verwirrung zu vermeiden, verwenden Sie zunächst eine davon konsequent.Aus Sicht der Best Practices ist es jedoch sinnvoll, bei der Variablendeklaration „String“ (kleines „s“) zu verwenden, und wenn Sie ihn als Klassennamen verwenden, ist „String“ (großes „S“) vorzuziehen.
Im folgenden Code ist die linke Seite eine Variablendeklaration, die mit „string“ deklariert wird.Auf der rechten Seite rufen wir eine Methode auf, daher ist „String“ sinnvoller.
string s = String.ToUpper() ;
Kleinbuchstaben string
ist ein Alias für System.String
.Sie sind gleich darin C#
.
Es gibt eine Debatte darüber, ob Sie die Systemtypen (System.Int32
, System.String
, usw.) Typen oder die C# aliases
(int
, string
, usw).Ich persönlich bin der Meinung, dass Sie das verwenden sollten C# aliases
, aber das ist nur meine persönliche Präferenz.
string
ist nur ein Alias für System.String
.Der Compiler wird sie identisch behandeln.
Der einzige praktische Unterschied besteht in der von Ihnen erwähnten Syntaxhervorhebung und darin, dass Sie schreiben müssen using System
wenn du benutzt String
.
Beide sind gleich.Aus Sicht der Codierungsrichtlinien ist es jedoch besser, es zu verwenden string
anstatt String
.Dies ist es, was Entwickler im Allgemeinen verwenden.z.B.statt zu verwenden Int32
wir gebrauchen int
als int
ist ein Alias Int32
FYI “Die Keyword -Zeichenfolge ist einfach ein Alias für die vordefinierte Klasse System.String
. ““ - C# Sprachspezifikation 4.2.3http://msdn2.microsoft.com/En-US/library/aa691153.aspx
Wie die anderen sagen, sind sie gleich.StyleCop-Regeln erzwingen standardmäßig die Verwendung string
als bewährte Methode für den C#-Codestil, außer bei der Referenzierung System.String
statische Funktionen, wie z String.Format
, String.Join
, String.Concat
, usw...
Neue Antwort nach 6 Jahren und 5 Monaten (Aufschub).
Während string
ist ein reserviertes C#-Schlüsselwort, das immer eine feste Bedeutung hat, String
ist nur ein gewöhnliches Identifikator was sich auf alles beziehen könnte.Abhängig von Mitgliedern des aktuellen Typs, dem aktuellen Namespace und dem angewendeten using
Weisungen und deren Anordnung, String
könnte ein Wert oder ein Typ sein, der sich von diesem unterscheidet global::System.String
.
Ich werde zwei Beispiele nennen, wo using
Richtlinien werden nicht helfen.
Erstens, wann String
ist ein Wert vom aktuellen Typ (oder einer lokalen Variablen):
class MySequence<TElement>
{
public IEnumerable<TElement> String { get; set; }
void Example()
{
var test = String.Format("Hello {0}.", DateTime.Today.DayOfWeek);
}
}
Das Obige lässt sich nicht kompilieren, weil IEnumerable<>
hat kein nicht statisches Mitglied namens Format
, und es gelten keine Erweiterungsmethoden.Im oben genannten Fall ist die Verwendung möglicherweise dennoch möglich String
in anderen Zusammenhängen, in denen a Typ ist syntaktisch die einzige Möglichkeit.Zum Beispiel String local = "Hi mum!";
könnte in Ordnung sein (abhängig vom Namespace und using
Richtlinien).
Schlechter:Sprichwort String.Concat(someSequence)
wird wahrscheinlich (abhängig davon) using
s) Gehen Sie zur Linq-Erweiterungsmethode Enumerable.Concat
.Es wird nicht zur statischen Methode gewechselt string.Concat
.
Zweitens, wann String
ist ein anderer Typ, verschachtelt im aktuellen Typ:
class MyPiano
{
protected class String
{
}
void Example()
{
var test1 = String.Format("Hello {0}.", DateTime.Today.DayOfWeek);
String test2 = "Goodbye";
}
}
Keine Aussage in der Example
Methode kompiliert.Hier String
ist immer ein Klavier Zeichenfolge, MyPiano.String
.Kein Mitglied (static
oder nicht) Format
existiert darauf (oder wird von seiner Basisklasse geerbt).Und der Wert "Goodbye"
kann nicht in sie umgewandelt werden.
Die Verwendung von Systemtypen erleichtert die Portierung zwischen C# und VB.Net, wenn Sie sich für so etwas interessieren.
Im Gegensatz zu dem, was bei anderen Programmierern gängige Praxis zu sein scheint, bevorzuge ich String
über string
, nur um die Tatsache hervorzuheben String
ist ein Referenztyp, wie Jon Skeet erwähnte.
string
ist ein Alias (oder eine Abkürzung) von System.String
.Das heißt, durch Tippen string
wir meinten System.String
.Weitere Informationen finden Sie unter think link: „string“ ist ein Alias/eine Abkürzung von System.String.
Zeichenfolge (System.String
) ist eine Klasse in der Basisklassenbibliothek.string (Kleinbuchstaben) ist ein reserviertes Werk in C#, das ein Alias für System.String ist.Int32 vs. int ist eine ähnliche Situation wie sie ist Boolean vs. bool
.Mit diesen für die C#-Sprache spezifischen Schlüsselwörtern können Sie Grundelemente in einem C-ähnlichen Stil deklarieren.
Ich möchte dies nur zu lfousts Antwort aus Ritchers Buch hinzufügen:
In der C# -Sprachspezifikation heißt es: „In Bezug auf Stil wird die Verwendung des Schlüsselworts für die Verwendung des vollständigen Systemtypnamens bevorzugt.“ Ich bin mit der Sprachspezifikation nicht einverstanden;Ich bevorzuge es, die Namen des FCL -Typs zu verwenden und die primitiven Namensnamen vollständig zu vermeiden.Tatsächlich wünschte ich mir, dass Compiler nicht einmal die primitiven Namen und Zwangsentwickler anbieten, stattdessen die Namen FCL -Typ zu verwenden.Hier sind meine Gründe:
Ich habe eine Reihe von Entwicklern erlebt, die verwirrt waren und nicht wussten, ob sie es verwenden sollten Zeichenfolgeoder Zeichenfolge in ihrem Code.Denn in C# Zeichenfolge (ein Schlüsselwort) entspricht genau System.String (ein FCL-Typ), gibt es keinen Unterschied und beide können verwendet werden.Ebenso habe ich einige Entwickler das sagen gehört int repräsentiert eine 32-Bit-Ganzzahl, wenn die Anwendung auf einem 32-Bit-Betriebssystem ausgeführt wird und dass sie eine 64-Bit-Ganzzahl darstellt, wenn die Anwendung auf einem 64-Bit-Betriebssystem ausgeführt wird.Diese Aussage ist absolut falsch:in C#, ein int Immer Karten zu System.Int32, und deshalb stellt es eine 32-Bit-Ganzzahl dar, unabhängig vom Betriebssystem, auf dem der Code ausgeführt wird.Wenn Programmierer es verwenden würden Int32 In ihrem Code wird diese potenzielle Verwirrung ebenfalls beseitigt.
In C#, lang Karten zu System.Int64, aber in einer anderen Programmiersprache, langkönnte einem zuordnen Int16 oder Int32.Tatsächlich behandelt C++/CLI lang als Int32.Jemand, der Quellcode in einer Sprache liest, könnte die Absicht des Codes leicht falsch interpretieren, wenn er oder sie es gewohnt war, in einer anderen Programmiersprache zu programmieren.Tatsächlich behandeln die meisten Sprachen sie nicht einmal lang Als Schlüsselwort und nicht kompilieren Code, der ihn verwendet.
Die FCL verfügt über viele Methoden, deren Methodennamen Typnamen enthalten.Zum Beispiel die BinaryReader Typ bietet Methoden wie ReadBoolean, ReadInt32, ReadSingle, und so weiter, und die System.Convert Typ bietet Methoden wie ToBoolean, ToInt32, ZuSingle, und so weiter.Obwohl es legal ist, den folgenden Code zu schreiben, ist die Linie mit schweben fühlt sich für mich sehr unnatürlich an und es ist nicht offensichtlich, dass die Linie korrekt ist:
BinaryReader br = new BinaryReader(...); float val = br.ReadSingle(); // OK, but feels unnatural Single val = br.ReadSingle(); // OK and feels good
Viele Programmierer, die C# ausschließlich verwenden, neigen ausschließlich zu vergessen, dass andere Programmiersprachen gegen die CLR verwendet werden können, und aus diesem Grund schleichen sich C# -ismen in den Klassenbibliothekscode ein.Zum Beispiel ist die FCL von Microsoft fast ausschließlich in C# geschrieben, und Entwickler im FCL -Team haben jetzt Methoden in die Bibliothek eingeführt, z. B. Array'S GetLongLength, was ein zurückgibt Int64 Wert, der ein ist 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 erst erfahren, als ich den gesamten Absatz gelesen hatte.
String
ist kein Schlüsselwort und kann als Bezeichner verwendet werden string
ist ein Schlüsselwort und kann nicht als Bezeichner verwendet werden.Und aus funktionaler Sicht sind beide gleich.
Zu spät zur Party kommen:Ich verwende die CLR-Typen zu 100 % (naja, außer wenn gezwungen den C#-Typ zu verwenden, aber ich kann mich nicht erinnern, wann das das letzte Mal war).
Ich habe ursprünglich vor Jahren damit begonnen, gemäß den CLR-Büchern von Ritchie.Für mich ergab es Sinn, dass letztendlich alle CLR-Sprachen in der Lage sein müssen, die Menge der CLR-Typen zu unterstützen, sodass die Verwendung der CLR-Typen selbst klareren und möglicherweise „wiederverwendbaren“ Code lieferte.
Jetzt, wo ich es schon seit Jahren mache, ist es eine Gewohnheit und mir gefällt die Färbung, die VS bei den CLR-Typen zeigt.
Der einzige wirkliche Wermutstropfen ist, dass die automatische Vervollständigung den C#-Typ verwendet, sodass ich am Ende automatisch generierte Typen erneut eintippe, um stattdessen den CLR-Typ anzugeben.
Außerdem sieht es für mich jetzt, wenn ich „int“ oder „string“ sehe, wirklich falsch aus, als würde ich C-Code aus den 1970er Jahren betrachten.
Es ist wirklich eine Frage der Konvention. string
Sieht einfach eher nach C/C++-Stil aus.Die allgemeine Konvention besteht darin, alle Verknüpfungen zu verwenden, die Ihre gewählte Sprache bereitgestellt hat (int/Int für Int32
).Dies gilt für „Objekt“ und decimal
sowie.
Theoretisch könnte dies dabei 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 etwas ändert int
Referenzen zu Int32
jedenfalls sicherheitshalber.
Es gibt keinen Unterschied.
Das C#-Schlüsselwort string
wird dem .NET-Typ zugeordnet System.String
- Es handelt sich um einen Alias, der sich an die Namenskonventionen der Sprache hält.
Ähnlich, int
Karten zu System.Int32
.
Zu diesem Thema gibt es ein Zitat von Buch von Daniel Solis.
Alle vordefinierten Typen werden direkt auf die zugrunde liegenden .NET -Typen abgebildet.Die C# -Typamen (Zeichenfolge) sind einfach Aliase für die .NET -Typen (String oder System.String). Die Verwendung der .NET -Namen funktioniert daher syntaktisch fein, obwohl dies entmutigt ist.In einem C# -Programm sollten Sie die C# -Namen und nicht die .NET -Namen verwenden.
Zeichenfolge ist ein Schlüsselwort und Sie können keine Zeichenfolge als Bezeichner verwenden.
Zeichenfolge ist kein Schlüsselwort und Sie können es als Bezeichner verwenden:
Beispiel
string String = "I am a string";
Das Schlüsselwort string
ist ein Alias für System.String
Abgesehen vom Schlüsselwort -Problem sind die beiden genau gleichwertig.
typeof(string) == typeof(String) == typeof(System.String)
Ja, das ist kein Unterschied zwischen ihnen, genau wie die bool
Und Boolean
.
Es gibt keinen Unterschied zwischen den beiden - string
, scheint jedoch die bevorzugte Option zu sein, wenn man den Quellcode anderer Entwickler in Betracht zieht.