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


Beispiel (Notieren 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?


5345


Ursprung


Antworten:


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

Soweit Richtlinien, wird es im Allgemeinen empfohlen zu verwenden string wann immer du dich auf ein Objekt beziehst.

z.B.

string place = "world";

Ebenso denke ich, dass es im Allgemeinen empfohlen wird zu verwenden String wenn Sie sich spezifisch auf die Klasse beziehen müssen.

z.B.

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

Dies ist der Stil, in dem Microsoft verwendet wird ihre Beispiele.


Es scheint, dass sich die Leitlinien in diesem Bereich möglicherweise geändert haben StilCop Erzwingt nun die Verwendung der C # -spezifischen Aliase.


5088



Nur der Vollständigkeit halber, hier ist ein Braindump von verwandten Informationen ...

Wie andere bemerkt haben, string ist ein Alias ​​für System.String. Sie kompilieren nach demselben Code, so dass zur Ausführungszeit überhaupt kein Unterschied besteht. Dies ist nur einer der Aliase 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

Außer, abgesondert, ausgenommen string und object, die Aliase sind 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 Aliase des Werttyps als "einfache Typen" bezeichnet. Literale können für konstante Werte jedes einfachen Typs verwendet werden; Für keine anderen Werttypen sind Literalformen verfügbar. (Vergleichen Sie dies mit VB, was erlaubt 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 Integral-Typ Produktion, die ein Token von ist sbyte, byte, short, ushort, int, uint, long, ulong, char... im Gegensatz zu a Art Produktion, wie sie beispielsweise von Variablendeklarationen verwendet wird. Es gibt keinen anderen Unterschied.

Schließlich, wenn es darum geht zu verwenden: persönlich verwende ich die Aliase überall für die Implementierung, aber den 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 nett, aber niemand wird sich darum kümmern. Auf der anderen Seite ist es wirklich wichtig, dass Sie, wenn Sie in einer API auf einen Typ verweisen, dies auf eine sprachneutrale Art tun. Eine Methode namens ReadInt32 ist eindeutig, während eine Methode namens ReadInt erfordert Interpretation. Der Anrufer könnte eine Sprache verwenden, die ein int Alias ​​für Int16, beispielsweise. Die .NET-Framework-Designer haben dieses Muster verfolgt, gute Beispiele sind in der BitConverter, BinaryReader und Convert Klassen.


3031



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(Intermediate Language), also gibt es keinen Unterschied. Wählen Sie, was Sie mögen und verwenden Sie das. Wenn Sie in C # programmieren, würde ich bevorzugen string da es sich um einen C # -Typ-Alias ​​handelt, der von C # -Programmierern gut bekannt ist.

Ich kann dasselbe sagen (int, System.Int32) etc..


607



Die beste Antwort, die ich jemals über die Verwendung der bereitgestellten Typen-Aliase in C # gehört habe, kommt 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 sie verwenden sollten Zeichenfolge oder Zeichenfolge in ihrem Code. Da in C # die Zeichenfolge (ein Schlüsselwort) genau auf System.String (ein FCL-Typ) abgebildet wird, gibt es keinen Unterschied und beide können verwendet werden.
  • In C #, lange Karten zu System.Int64, aber in einer anderen Programmiersprache, lange könnte zu einem zuordnen Int16 oder Int32. Tatsächlich behandelt C ++ / CLI tatsächlich lange als Int32. Jemand, der Quellcode in einer Sprache liest, könnte die Absicht des Codes leicht falsch interpretieren, wenn er oder sie daran gewöhnt wäre, in einer anderen Programmiersprache zu programmieren. In der Tat werden die meisten Sprachen nicht einmal behandeln lange als Schlüsselwort und kompiliert keinen Code, der es verwendet.
  • Die FCL hat viele Methoden, die Typnamen als Teil ihrer Methodennamen enthalten. Zum Beispiel, die BinärReader Typ bietet Methoden wie ReadBoolean, ReadInt32, LesenSingleund so weiter und so weiter System.Convert Typ bietet Methoden wie ToBoolean, ToInt32, ZuSingle, und so weiter. Obwohl es legal ist, den folgenden Code zu schreiben, fühlt sich die Zeile mit Float 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

So, da hast du es. Ich denke, das sind alles wirklich gute Punkte. Ich finde jedoch nicht, dass ich Jeffreys Rat in meinem eigenen Code benutze. Vielleicht bin ich zu fest in meiner C # -Welt, aber am Ende versuche ich, meinen Code wie den Framework-Code aussehen zu lassen.


409



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 Zeichenfolge, Sie würden nur die ersten dieser Kompilierungen sehen:

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

Wenn Sie wirklich einen Variablennamen namens wollen Zeichenfolge Sie können verwenden @ als Präfix:

StringBuilder @string = new StringBuilder();

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


380



Es gibt einen Unterschied - Sie können nicht verwenden String ohne using System; vorher.


327



Es wurde oben behandelt; Sie können jedoch nicht verwenden string in Reflexion; Sie müssen verwenden String.


269



System.String ist die .NET-String-Klasse - in C # string ist ein Alias ​​für System.String - so im Gebrauch sind sie gleich.

Was die Richtlinien betrifft, würde ich nicht zu festgefahren werden und einfach nur das verwenden, was man möchte - es gibt wichtigere Dinge im Leben und der Code wird sowieso derselbe sein.

Wenn Sie Systeme finden, bei denen es notwendig ist, die Größe der ganzen Zahlen anzugeben, die Sie verwenden, und die Sie so verwenden möchten Int16, Int32, UInt16, UInt32 etc. dann könnte es natürlicher aussehen zu verwenden String- und wenn man zwischen verschiedenen .net-Sprachen hin- und herwechselt, kann das die Dinge verständlicher machen - sonst würde ich string und int verwenden.


204



Ich bevorzuge die Großbuchstaben .NET Typen (anstatt der Aliase) aus Gründen der Formatierung. Das .NET Typen sind genauso farbig wie andere Objekttypen (die Werttypen sind schließlich richtige Objekte).

Bedingungs- und Kontrollschlüsselwörter (wie if, switch, und return) sind klein und dunkelblau (standardmäßig). Und ich möchte die Unstimmigkeiten nicht in Gebrauch und Format haben.

Erwägen:

String someString; 
string anotherString; 

167



string und String sind in jeder Hinsicht identisch (mit Ausnahme des Großbuchstabens "S"). Es gibt keine Auswirkungen auf die Performance.

Kleinbuchstaben string wird in den meisten Projekten aufgrund der Syntax-Hervorhebung bevorzugt


166