2009-10-20 6 views
0

Quand j'applique IEnumerator et exécute MoverNext() traversera-t-il comme C-Style 'a' 'p' 'p' 'l' 'e' '\o' jusqu'à ce qu'il trouve le caractère nul? Je pensais qu'il retournerait la chaîne entière. Comment l'énumération fonctionne-t-elle ici?Comment Char By Char Traversal est-il possible?

string ar = "apple"; 

    IEnumerator enu = ar.GetEnumerator(); 

    while (enu.MoveNext()) 
    { 

     Console.WriteLine(enu.Current); 
    } 

je reçois comme sortie

a 
p 
p 
l 
e 

Répondre

8

Les chaînes ne sont pas terminées par un caractère nul en C#. Ou, plutôt, le fait que les chaînes sont terminées par un caractère nul est un détail d'implémentation qui est caché à l'utilisateur. La chaîne "apple" a cinq caractères, pas six. Vous demandez à voir ces cinq personnages, nous vous les montrons tous. Il n'y a pas de sixième caractère nul.

+0

Comment C# trouve que la traverse vient eng? – user193276

+0

désolé traverse vient à la fin – user193276

+0

Il connaît la longueur de la chaîne. Pas besoin d'un terminateur. – EricSchaefer

3

Le caractère nul ne fait pas partie inhérente d'un CLR/string .Net et n'affichera donc pas dans l'énumération. L'énumération d'une chaîne renverra les caractères de la chaîne dans l'ordre

2

Un énumérateur renvoie chaque élément du conteneur sous-jacent par itération (appel MoveNext()). Dans ce cas, votre conteneur est un string et son type d'élément est char, de sorte que l'énumérateur renvoie un caractère pour chaque itération.

En outre, la longueur de la chaîne est connue par le type string, qui peut être exploitée par l'implémentation de l'énumérateur pour savoir quand mettre fin à sa traversée.

2

Les chaînes C# sont stockées comme des chaînes COM, un champ de longueur et une liste de caractères Unicode. Par conséquent, il n'y a pas besoin d'un terminateur. Il utilise un peu plus de mémoire (2 octets de plus) mais les chaînes elles-mêmes peuvent contenir des zéros sans aucun problème.

Une autre façon d'analyser des chaînes qui utilise les mêmes fonctionnalités que votre code est seulement plus C# -like:

string s="..."; 
foreach(char c in s) 
    Console.WriteLine(c);