.net vs - Was ist der Unterschied zwischen String und String in C#?




typescript java (25)

Beispiel ( Fall beachten ):

string s = "Hello world!";
String s = "Hello world!";

Was sind die Richtlinien für die Verwendung von jedem? Und was sind die Unterschiede ?


Answers

System.String ist die .NET-Zeichenfolgenklasse - in C # string ist ein Alias ​​für System.String sind sie in der Verwendung identisch.

Was die Richtlinien angeht, würde ich mich nicht zu sehr festsetzen und einfach das verwenden, was Sie möchten - es gibt wichtigere Dinge im Leben und der Code wird auf jeden Fall derselbe sein.

Wenn Sie feststellen, dass Systeme erstellt werden, bei denen die Größe der von Ihnen verwendeten Ganzzahlen angegeben werden muss, und Sie dazu tendieren, Int16 , Int32 , UInt16 , UInt32 usw. zu verwenden, dann ist die Verwendung von String natürlicher, wenn Sie sich zwischen verschiedenen UInt32 bewegen .net-Sprachen könnten die Dinge verständlicher machen - ansonsten würde ich string und int verwenden.


Die Verwendung von Systemtypen erleichtert das Portieren zwischen C # und VB.Net, wenn Sie sich für solche Dinge interessieren.


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

Wenn Sie aus irgendeinem Grund eine Variable namens string wollten, 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 wünschen, können Sie @ als Präfix verwenden:

StringBuilder @string = new StringBuilder();

Ein weiterer kritischer Unterschied: hebt sie anders hervor.


Neue Antwort nach 6 Jahren und 5 Monaten (Verschleppung).

Während stringist ein reserviertes C # Schlüsselwort , das immer eine feste Bedeutung hat, Stringist nur eine gewöhnliche Kennung , das auf etwas verweisen konnte. Abhängig von den Mitgliedern des aktuellen Typs können der aktuelle Namespace und die angewendeten usingDirektiven sowie deren Anordnung Stringein Wert oder ein Typ sein, der sich von unterscheidet global::System.String.

Ich werde zwei Beispiele usinganführen, bei denen Richtlinien nicht helfen .

Erstens, wann Stringist ein Wert des aktuellen Typs (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 wird nicht kompiliert, da IEnumerable<>kein nicht statisches Member aufgerufen Formatwird und keine Erweiterungsmethoden angewendet werden. Im obigen Fall kann es immer noch möglich sein, sie Stringin anderen Zusammenhängen zu verwenden, in denen ein Typ die einzige Möglichkeit ist, syntaktisch. Zum Beispiel String local = "Hi mum!";könnte OK sein (abhängig von Namespace und usingDirektiven).

Schlimmer noch: Das Sprichwort String.Concat(someSequence)wird (abhängig von usings) wahrscheinlich zur Linq-Erweiterungsmethode gehen Enumerable.Concat. Es wird nicht die statische Methode verwendet string.Concat.

Zweitens, wenn Stringein anderer Typ im aktuellen Typ verschachtelt ist:

class MyPiano
{
  protected class String
  {
  }

  void Example()
  {
    var test1 = String.Format("Hello {0}.", DateTime.Today.DayOfWeek);
    String test2 = "Goodbye";
  }
}

Keine der Anweisungen in der ExampleMethode wird kompiliert. Hier Stringist immer ein Klavier - string , MyPiano.String. Es existiert kein Member ( staticoder nicht) Format(oder wird von seiner Basisklasse geerbt). Und der Wert "Goodbye"kann nicht in diesen Wert umgewandelt werden.



Es gibt keinen Unterschied.

Das Schlüsselwort C # stringist dem .NET-Typ zugeordnet System.String- es ist ein Alias, der die Namenskonventionen der Sprache einhält.

Ebenso intKarten zu System.Int32.


Ich ziehe die großgeschriebenen .NET Typen (anstelle der Aliasnamen) aus Gründen der Formatierung vor. Die .NET Typen haben dieselbe Farbe wie andere Objekttypen (die Werttypen sind schließlich richtige Objekte).

Bedingte Schlüsselwörter und Steuerelemente (z. B. if , switch und return ) sind in Kleinbuchstaben und dunkelblau (Standardeinstellung). Und ich möchte lieber nicht die Uneinigkeit in der Verwendung und im Format haben.

Erwägen:

String someString; 
string anotherString; 

Ich möchte dies nur der Antwort von lfousts hinzufügen, vom Buch Ritchers:

In der C # -Sprachenspezifikation heißt es: „Die Verwendung des Schlüsselworts wird aus Stilgründen gegenüber der Verwendung des vollständigen Systemtypnamens bevorzugt.“ Ich stimme der Sprachspezifikation nicht zu; Ich ziehe es vor, die FCL-Typnamen zu verwenden und die primitiven Typnamen vollständig zu vermeiden. Ich wünschte sogar, dass Compiler nicht einmal die primitiven Typnamen anboten und die Entwickler gezwungen waren, stattdessen die FCL-Typnamen zu verwenden. Hier sind meine Gründe:

Ich bekam seine Meinung nicht, bevor ich den ganzen Abschnitt gelesen habe.


Dieses YouTube- Video zeigt praktisch, wie sie sich unterscheiden.

Nun aber zu einer langen Textantwort.

Wenn wir über .NET sprechen, gibt es zwei verschiedene Dinge: .NET Framework und die anderen Sprachen ( C# , VB.NET usw.), die dieses Framework verwenden.

" System.String " oder "String" (Großbuchstabe "S") ist ein .NET Framework-Datentyp, während "String" ein C# System.String ist.

Kurz gesagt, "String" ist ein Alias ​​von "String". Technisch gesehen geben also beide Code-Anweisungen dieselbe Ausgabe aus.

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 , System.String : System.Boolean , Byte: System.Byte , Sbyte: System.SByte , kurz: System.Int16 usw.

Jetzt die Millionen-Dollar-Frage aus Sicht des Programmierers. Wann also "String" und "String" verwenden?

Um Verwirrung zu vermeiden, verwenden Sie eine von ihnen konsequent. Aus Sicht der Best Practices ist es jedoch sinnvoll, bei der Variablendeklaration "string" (kleine "s") zu verwenden, und wenn Sie ihn als Klassennamen verwenden, wird "String" (groß "S") bevorzugt.

Im folgenden Code ist die linke Seite eine Variablendeklaration und wird mit "string" deklariert. Auf der rechten Seite nennen wir eine Methode, daher ist "String" sinnvoller.

string s = String.ToUpper() ;

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


String ist ein Schlüsselwort und Sie können String nicht als Bezeichner verwenden.

String ist kein Schlüsselwort und Sie können es als Bezeichner verwenden:

Beispiel

string String = "I am a string";

Das Keyword stringist ein Alias ​​für System.Stringabgesehen von der Keyword-Ausgabe, die beiden sind genau gleichwertig.

 typeof(string) == typeof(String) == typeof(System.String)

Beide sind gleich. Aus Sicht der Codierungsrichtlinien ist es jedoch besser, string anstelle von String . Dies ist, was Entwickler normalerweise verwenden. Anstatt Int32 wir beispielsweise int da int is ein Alias ​​für Int32

FYI "Der Schlüsselwortstring ist einfach ein Alias ​​für die vordefinierte Klasse System.String ." - C # System.String http://msdn2.microsoft.com/En-US/library/aa691153.aspx


Anders als bei anderen Programmierern allgemein üblich, bevorzuge ich String gegenüber string , nur um die Tatsache hervorzuheben, dass String ein Referenztyp ist, wie Jon Skeet erwähnt hat.


String ( System.String ) ist eine Klasse in der Basisklassenbibliothek. String (Kleinbuchstaben) ist eine in C # reservierte Arbeit, die ein Alias ​​für System.String ist. Int32 vs. Int ist eine ähnliche Situation wie Boolean vs. bool . Mit diesen für die C # -Sprache spezifischen Schlüsselwörtern können Sie Grundelemente in einem ähnlichen Stil wie C deklarieren.


System.String ist ein Alias ​​für System.String . Sie sind in C# .

Es gibt eine Debatte darüber, ob Sie die System.Int32 ( System.Int32 , System.String usw.) oder die C# aliases ( int , string usw.) verwenden sollten. Ich persönlich glaube, Sie sollten die C# aliases , aber das ist nur meine persönliche Präferenz.


Es gibt keinen Unterschied zwischen den beiden - stringscheint jedoch die bevorzugte Option zu sein, wenn man den Quellcode anderer Entwickler betrachtet.


String steht für System.String und ist ein .NET Framework-Typ. string ist ein Alias in der C # -Sprache für System.String . Beide werden in IL (Intermediate Language) nach System.String kompiliert, sodass es keinen Unterschied gibt. Wählen Sie, was Ihnen gefällt und verwenden Sie das. Wenn Sie in C # codieren, würde ich string bevorzugen, da es sich um einen Aliasnamen vom Typ C # handelt, der von C # -Programmierern bekannt ist.

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


string ist nur ein Alias ​​für System.String . Der Compiler behandelt sie gleich.

Der einzige praktische Unterschied besteht in der Hervorhebung der Syntax, die Sie erwähnen, und dass Sie using System schreiben müssen using System wenn Sie String .


Nur der Vollständigkeit halber hier ein Gehirnmüll von verwandten Informationen ...

Wie bereits erwähnt, ist string ein Alias ​​für System.String . Sie kompilieren zu demselben Code, so dass es zur Ausführungszeit keinerlei Unterschied gibt. 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

Abgesehen von string und object sind alle Aliase Werttypen. decimal ist ein Werttyp, jedoch kein primitiver Typ in der CLR. Der einzige primitive Typ ohne Alias ​​ist System.IntPtr .

In der Spezifikation werden die Werttyp-Aliasnamen als "einfache Typen" bezeichnet. Literale können für konstante Werte jedes einfachen Typs verwendet werden. Für andere Werttypen sind keine Literalformen verfügbar. (Vergleichen Sie dies mit VB, das DateTime Literale erlaubt, und hat auch einen Alias ​​dafür.)

Es gibt einen Umstand, in dem Sie die Aliase verwenden müssen: wenn Sie den zugrunde liegenden Typ einer Enumeration explizit angeben. Zum Beispiel:

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

Das ist nur eine Frage der Art und Weise, wie die Spezifikation Enumerationsdeklarationen definiert - der Teil nach dem Doppelpunkt muss die Produktion des integralen Typs sein , die ein Zeichen von sbyte , byte , short , ushort , int , uint , long , ulong , char . .. im Gegensatz zu einer Typproduktion, wie sie beispielsweise von Variablendeklarationen verwendet wird. Es zeigt keinen anderen Unterschied.

Schließlich, wenn es um die Verwendung geht: Ich persönlich benutze die Aliase überall für die Implementierung, aber den CLR-Typ für alle APIs. Es spielt eigentlich keine Rolle, was Sie in Bezug auf die Implementierung verwenden - die Konsistenz in Ihrem Team ist schön, aber niemand sonst kümmert es. Auf der anderen Seite ist es wirklich wichtig, dass Sie, wenn Sie sich auf einen Typ in einer API beziehen, dies sprachneutral tun. Eine Methode namens ReadInt32 ist eindeutig, wohingegen eine Methode namens ReadInt eine Interpretation erfordert. Der Anrufer könnte beispielsweise eine Sprache verwenden, die einen int Alias ​​für Int16 definiert. Die .NET-Framework-Designer sind diesem Muster gefolgt. Gute Beispiele hierfür sind die Klassen BitConverter , BinaryReader und Convert .


Wie die anderen sagen, sind sie gleich. Die StyleCop-Regeln zwingen Sie standardmäßig zur Verwendung von string als String.Format String.Join C # -Code-Stil, außer wenn statische Funktionen von System.String werden, z. B. String.Format , String.Join , String.Concat usw.


Zu diesem Thema gibt es ein Zitat aus Daniel Solis 'Buch .

Alle vordefinierten Typen werden direkt den zugrunde liegenden .NET-Typen zugeordnet. Die C # -Typnamen (Zeichenfolge) sind einfach Aliasnamen für die .NET-Typen (String oder System.String). Die Verwendung der .NET-Namen funktioniert also syntaktisch einwandfrei, obwohl davon abgeraten wird. In einem C # -Programm sollten Sie die C # -Namen anstelle der .NET-Namen verwenden.


string und String sind in jeder Hinsicht identisch (außer dem Großbuchstaben "S"). Es gibt keine Auswirkungen auf die Leistung.

In den meisten Projekten wird aufgrund der Hervorhebung der Syntax Kleinbuchstaben 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- string wird System.String .

Theoretisch könnte ein C # -Compiler implementiert werden, der Java-Bytecode generiert. Eine sinnvolle Implementierung dieses Compilers würde wahrscheinlich den string java.lang.String , um mit der Java-Laufzeitbibliothek zusammenzuarbeiten.


Es ist oben abgedeckt worden; Sie können string jedoch nicht in Reflektion verwenden. Sie müssen String .


Versuchen Sie dies, viel weniger Code:

System.Text.Encoding.UTF8.GetBytes("TEST String");




c# .net string types alias