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?

War es hilfreich?

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.

enter image description here

"System.String" auch bekannt als „String“ (Großbuchstabe „S“) ist ein .NET Framework-Datentyp, während „string“ ein ist C# Datentyp.

enter image description here

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) usings) 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top