2010-09-24 15 views
5

Ich will nur sicher sein:Interne Darstellung von Zeichenketten in C#

string x = ""; 
char Char = x[0]; // throws exception: "Index was outside the bounds of the array" 

Das bedeutet, dass die Saite wirklich als ein Array von Zeichen behandelt wird, nicht wahr? (Mindestens intern.)

Antwort

6

Per @JaredPar elsewhere on this site:

Die underyling Zeichenfolge Sie erstellen brauchen auch einen zusammenhängenden Speicherblock , weil es als ein Array von Zeichen dargestellt wird (Arrays erfordern zusammenhängend Speicher).

Ich bin sicher, dass Sie sich darauf nicht verlassen sollten, da sie nicht Teil des Schnittstelle sind, aber Implementierung ist ein Array, wenn diese Aussage richtig ist. Das macht Sinn, wenn man bedenkt, was wir über Char-Strings und Microsofts Notwendigkeit wissen, einen effizienten Interop zwischen verwalteten und nativen Sprachen zu unterstützen.

MSDN sagt nur das, was nicht garantiert, dass der Speicher ein Array ist.

Ein String ist eine sequenzielle Auflistung von Unicode-Zeichen, die zu repräsentieren Text verwendet wird. Ein String-Objekt ist eine sequentielle Auflistung von System.Char -Objekten, die eine Zeichenfolge darstellen. Der Wert des String-Objekts ist der Inhalt der sequenziellen Auflistung, , und dieser Wert ist unveränderlich (dh es ist schreibgeschützt).

+0

+1 für eine klare, dokumentierte Antwort. – NotMe

13

Die C# -Sprachspezifikation gibt keine Garantie für die interne Darstellung eines Strings. Es implementiert jedoch den Indexoperator, um ein Zeichen für jedes Zeichen in der Zeichenfolge bereitzustellen.

Bearbeiten: Um zu verdeutlichen, da ein paar Leute kommentiert haben, ja, ist die interne Darstellung von System.String in der CLR ein Array. Die Sprachspezifikation sagt jedoch nichts über die interne Repräsentation aus, was sich ändern könnte (aber unwahrscheinlich ist). Es besagt, dass eine Zeichenfolge als eine Folge von Zeichen funktionieren muss. Das einzige bisschen darüber in der Sprachspezifikation ist unter Abschnitt 1.3:

Zeichen und Zeichenfolge Verarbeitung in C# verwendet Unicode-Codierung. Der Zeichenartstyp steht für eine UTF-16-Codeeinheit und der Zeichenfolgentyp für eine Sequenz von UTF-16-Codeeinheiten. Zusätzlich

, MSDN Zustände:

Ein String ist eine sequenzielle Auflistung von Unicode-Zeichen, die verwendet wird, um Text darzustellen. Ein String-Objekt ist eine sequenzielle Auflistung von System.Char-Objekten, die eine Zeichenfolge darstellen. Der Wert des String-Objekts ist der Inhalt der sequenziellen Auflistung, und dieser Wert ist unveränderlich (dh er ist schreibgeschützt).

Also in diesem Fall sprechen wir jetzt über die CLR und nicht die Sprache. System.String - Aber auch dort garantieren sie kein Array, nur eine sequenzielle Sammlung.

Eine Zeichenfolge, die mit einer verketteten Liste implementiert wurde, und ein Indexer, der n Leerzeichen in der Liste vorwärts verschoben hat, würde ausreichen, um die Sprachanforderungen zu erfüllen. IList<char> würde auch die Anforderungen erfüllen, und IList muss nicht Array-Backed sein.

+7

@Bear Monkey - 'sequentielle Sammlung' ist nicht dasselbe wie 'Array'. Sie sollten Ihren Downvote zurückziehen, denke ich. –

+1

Die einzige Einschränkung im normativen ECMA-Dokument spricht von Zeichenpuffer, nicht speziell von einer System.Array-Instanz: Implementierungen von System.Die Zeichenfolge muss einen Zeichenpuffer variabler Länge enthalten, der nach am Anfang des String-Objekts eine feste Anzahl von Bytes positioniert. –

+0

Er sagt Array nicht, er sagt, es gibt keine Garantien für die interne Darstellung. Aber das ist nicht wahr. –

1

Sie könnten diese MSDN doc hilfreich finden.

Auf den Punkt gebracht, eine Zeichenfolge

Und, ja, es kann wie ein char-Array zugegriffen werden „wie eine sequentielle Sammlung von Char-Objekte schreibgeschützt gespeichert“. Wenn X also einen anderen Wert als String.Empty enthielt, hätte der Code char Char=X[0;] das erste Zeichen der Zeichenfolge zurückgegeben.

1

C# ist nur die Sprache. Das Zeichenfolgenschlüsselwort ist ein Alias ​​für System.String in der BCL des .NET-Frameworks. Es ist ziemlich sicher anzunehmen, dass intern String ein Array von Zeichen ist. Von MSDN:

Eine Zeichenfolge ist eine sequenzielle Auflistung von Unicode-Zeichen, die zur Darstellung von Text verwendet wird. Ein String-Objekt ist eine sequenzielle Auflistung von System.Char-Objekten, die eine Zeichenfolge darstellen.

0

Es hängt davon ab, was Sie mit "Array" meinen.

Wenn Sie das allgemeine Computing-Konzept einer zufälligen Zugriff, feste Länge, Integer-indexierbare Sammlung von Objekten, dann ja, kann eine Zeichenfolge genau so angesehen werden. (Das allgemeine Berechnungskonzept beinhaltet oft, dass es zusammenhängend im Speicher ist, aber abgesehen von einigen Fällen, wie z. B. die Verwendung von Zeigern in unsicherem Code, ist dies hinsichtlich C# nicht sehr bedeutungsvoll).

Wenn Sie die Sprache definiert C# Umsetzung dieses Konzepts, char[] dann nicht wirklich, die beiden sind verschiedene Dinge. In der Praxis wird System.String tatsächlich als ein Array von char s implementiert, aber es muss nicht gewesen sein.

Sprache nit-Picks beiseite, die praktische Bit:

Wenn Sie die gleichen Operationen an einer Schnur tun möchten, wie Sie es auf einem char[] dann wird dies oft arbeiten (vor allem aber, String schreibgeschützt) und sehr oft der effizienteste Weg, so lange konzeptionell ganz einfach. Insbesondere unter Verwendung von foreach und unter Verwendung eines Index, der sich zwischen 0 und str.Length - 1 bewegt, funktionieren gut. In ähnlicher Weise können viele Vorgänge, die man unter char[] tun kann, unter string, wie CopyTo() und Gießen nach IEnumerable<char> durchgeführt werden.

Wenn Sie tatsächlich eine Reihe von Zeichen haben möchten, müssen Sie ToCharArray() anrufen.

Verwandte Themen