2010-09-24 22 views
5

Voglio solo essere sicuro:rappresentazione interna di stringhe in C#

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

Ciò significa che la stringa è davvero trattato come un array di caratteri, giusto? (Almeno internamente.)

risposta

6

Per @JaredPar elsewhere on this site:

La stringa underyling si crea avrà anche bisogno di un blocco contiguo di memoria perché viene rappresentata come un array di caratteri (array richiedono memoria contigua ).

Sono sicuro che non si dovrebbe fare affidamento su questo come non è parte del dell'interfaccia, ma implementazione è un array se questa affermazione è corretta. Per me è logico ciò che sappiamo delle stringhe di caratteri e la necessità di Microsoft di supportare un'interoperabilità efficiente tra le lingue gestite e native.

MSDN dice solo questo, che non garantisce che la memoria sia una matrice.

Una stringa è una raccolta sequenziale di caratteri Unicode che viene utilizzato per rappresentare il testo. Un oggetto String è una raccolta sequenziale di oggetti System.Char che rappresentano una stringa. Il valore dell'oggetto String è il contenuto della raccolta sequenziale, e tale valore è immutabile (ovvero, è di sola lettura).

+0

+1 per una risposta chiara e documentata. – NotMe

13

Le specifiche del linguaggio C# non garantiscono la rappresentazione interna di una stringa. Tuttavia, implementa l'operatore indice per fornire un carattere per ogni carattere nella stringa.

Modifica: Per chiarire poiché alcune persone hanno commentato, sì, la rappresentazione interna di System.String nel CLR è una matrice. Tuttavia, le specifiche del linguaggio non dicono nulla sulla rappresentazione interna, quindi questo potrebbe (ma è improbabile che) cambiare. Dice che una stringa deve funzionare come una sequenza di caratteri. L'unica po 'su questo nelle specifiche lingua è nella sezione 1.3:

carattere e di elaborazione delle stringhe in C# utilizza la codifica Unicode. Il tipo di carattere rappresenta un'unità di codice UTF-16 e il tipo di stringa rappresenta una sequenza di unità di codice UTF-16.

Inoltre, MSDN stati:

una stringa è un insieme sequenziale di caratteri Unicode che viene utilizzato per rappresentare il testo. Un oggetto String è una raccolta sequenziale di oggetti System.Char che rappresentano una stringa. Il valore dell'oggetto String è il contenuto della raccolta sequenziale e tale valore è immutabile (ovvero è di sola lettura).

Quindi in questo caso, stiamo parlando del CLR e non della lingua. System.String - Tuttavia, anche lì non garantiscono un array, solo una collezione sequenziale.

Una stringa implementata con un elenco collegato e un indicizzatore che spostava gli spazi n nella lista sarebbe sufficiente per soddisfare i requisiti di lingua. IList<char> soddisferebbe anche i requisiti e IList non deve essere sottoposto a array.

+7

@Bear Monkey - 'collezione sequenziale' non è la stessa cosa di 'array'. Dovresti ritirare il tuo downvote, penso. –

+1

L'unica limitazione nel documento ECMA normativo riguarda il buffer dei caratteri, non specificamente un'istanza System.Array: Implementazioni di Sistema.Le stringhe devono contenere un buffer di caratteri a lunghezza variabile posizionato un numero fisso di byte dopo l'inizio dell'oggetto String. –

+0

Non dice array dice che non fornisce garanzie sulla rappresentazione interna. Ma questo non è vero. –

1

È possibile trovare questo MSDN doc utile.

In poche parole, una stringa è "memorizzato come un sequenziale sola lettura collezione di oggetti Char"

E, sì, è possibile accedervi come un array di caratteri. Quindi, se X conteneva un valore diverso da String.Empty, allora il codice char Char=X[0;] avrebbe restituito il primo carattere della stringa.

1

C# è solo la lingua. La parola chiave string è un alias per System.String nel BCL di .Net framework. È abbastanza sicuro assumere che internamente String sia un array di caratteri. Da MSDN:

Una stringa è una raccolta sequenziale di caratteri Unicode che viene utilizzata per rappresentare il testo. Un oggetto String è una raccolta sequenziale di oggetti System.Char che rappresentano una stringa.

0

Dipende da cosa intendi per "matrice".

Se si intende il concetto di calcolo generale di una raccolta di oggetti a accesso fisso, a lunghezza fissa, indicizzabile in numero intero, allora sì, una stringa può essere considerata esattamente come quella. (Il concetto di calcolo generale spesso include l'essere contigui in memoria, ma salvo alcuni casi, come l'uso di puntatori in codice non sicuro, ciò non è molto significativo in termini di C#).

Se si intende l'implementazione C# definita in linguaggio di questo concetto, char[] quindi non proprio, i due sono cose diverse.

In pratica, System.String è effettivamente implementato come una serie di char s, ma non deve essere stato.

lingua nit-picks a parte, il bit pratico:

Se si vuole fare le stesse operazioni su una stringa come si farebbe su un char[] allora questo funzionerà spesso (in particolare se, string è di sola lettura) e molto spesso è il modo più efficace per farlo, purché concettualmente piuttosto semplice. In particolare, l'utilizzo di foreach e l'utilizzo di un indice che si sposta tra 0 e str.Length - 1 funzionano bene. Allo stesso modo, molte operazioni che è possibile eseguire su char[] possono essere eseguite su string, ad esempio CopyTo() e trasmesse a IEnumerable<char>.

Se si desidera effettivamente disporre di una matrice di caratteri, è necessario chiamare ToCharArray().

Problemi correlati