2013-12-12 20 views
6

Ich weiß, dass es wie eine seltsame Frage klingen mag, aber das ist in meinem Kopf für eine Weile weitergegangen.System.String Typ in C#

Ich weiß, dass der System.String-Typ in C# eigentlich eine Klasse mit einem Konstruktor ist, der einen Character-Array-Parameter hat. Zum Beispiel der folgende Code ist legal und verursacht keine Fehler:

System.String s = new System.String("Hello".toCharArray()); 

Meine Frage ist, was macht, ist möglich, dass die Klasse System.String eine Reihe von Zeichen zu akzeptieren, einfach auf diese Weise:

System.String s = "Hello"; 
+3

Der Compiler Team machte das möglich. Genau wie andere Literale, Nullable ', Erweiterungsmethoden, etc. –

+0

Könnte es wegen des Indexers sein, den es verwendet? und wenn ja, wie macht es das? – Transcendent

+0

Es ist ein Sprachkonstrukt, genau wie eine 'if' Anweisung oder das' var' Schlüsselwort. Es ist einfach, wie die Sprache funktioniert, "String" ist ein spezieller Fall, um eine einfachere Verwendung zu ermöglichen. –

Antwort

8

Wenn Sie anrufen:

System.String s = new System.String("Hello".toCharArray()); 

Sie explizit einen Konstruktor

Aufruf Wenn Sie schreiben:

string foo = "bar"; 

Eine AWL-Anweisung (Ldstr) schiebt ein neues Objekt Verweis auf diese Zeichenfolge wörtlich. Es ist nicht dasselbe wie ein Konstruktor aufzurufen.

+1

Verdammt, Servy hat magische Kräfte – Habib

3

Dies ist möglich, weil die C# language angibt, dass String-Literale möglich sind (siehe §2.4.4.5 String-Literale). Der C# -Compiler und CIL/CLR haben eine gute Unterstützung dafür, wie diese Literale verwendet werden, z. mit dem ldstr Opcode.

Es gibt keine Unterstützung für die Aufnahme solcher Literale für Ihre eigenen benutzerdefinierten Typen.

-2

Strings sind eine Art spezieller CLR-Typ. Sie sind der einzige unveränderbare Referenztyp.

Hier sind einige Dinge, die Sie String-Typ verstehen helfen:

var a = "Hello"; 
var b = new String("Hello".ToCharArray()); 
var c = String.Intern(b); // 'interns' the string... 
var equalsString = a == b; // true 
var equalsObj = (object)a == (object)b; // false 
var equalsInterned = (object)a == (object)c; // true !! 

a[0] = 't'; // not valid, because a string is immutable. Instead, do it this way: 
var array = b.ToArray(); 
array[0] = 't'; 
a = new String(array); // a is now "tello" 
+0

'Sie sind der einzige unveränderliche Referenztyp.' Was? "Ja wirklich?" Tut mir leid aber nein. Es gibt * viele * unveränderliche Referenztypen. Hier ist noch eine: 'öffentliche Klasse Foo {}' – Servy

+0

@Servy Das ist Unveränderlichkeit von Design ... Strings sind unveränderlich, weil die Clr sagte, nicht der Programmierer. – Olivier

+1

Zunächst einmal gibt es keinen wirklichen Unterschied. Zweitens sind Strings nicht einmal unveränderlich, technisch gesehen sind sie in ihrer öffentlichen API unveränderlich. Interne Strings können tatsächlich in bestimmten Situationen tatsächlich mutiert sein, so dass offensichtlich keine Unveränderlichkeit durch die Laufzeit erzwungen wird; klar es erlaubt es. – Servy

Verwandte Themen