2008-12-10 8 views
5

Est-ce qu'une chaîne est en fait un tableau de caractères (is-a), ou a-t-elle un tableau de caractères comme magasin interne (has-a) ou est-ce son propre objet qui peut s'exposer avec un tableau de caractères?Quelles sont les chaînes vraiment dans .NET?

Je suis plus enclin à dire que c'est son propre objet, mais alors pourquoi sommes-nous si enclins à toujours dire "Une chaîne est un tableau de caractères ..."?

+0

Pourquoi le demandez-vous? Curiosité? Un problème votre confrontation? –

+0

Un morceau magique de cyber-ficelle trempé dans un tableau de Gooy. – Echostorm

+0

Veuillez modifier la question pour mentionner .NET quelque part dedans. J'ai répondu en fonction de l'étiquette de question. –

Répondre

7

la chaîne .NET n'est pas simplement un tableau de caractères. Il contient un tableau de caractères, donc à proprement parler, c'est has-a.

De plus, il y a beaucoup de subtilités liées à Unicode où il ne se comporte pas quoi que ce soit comme un tableau. La concaténation d'un personnage peut faire beaucoup plus que simplement augmenter la longueur de la chaîne de un et insérer le nouveau caractère à la fin. Selon les règles de normalisation Unicode, il se peut que la chaîne entière soit modifiée.Donc, est certainement rien de tel qu'un tableau de caractères, mais quelque part dans la classe, un tel tableau existe.

1

MSDN: Le type de chaîne représente une chaîne de caractères Unicode.

Cela signifie: c'est un tableau de caractères Unicode.

+0

Merde, 44 secondes! = P –

+0

Quel type de définition utilise le terme défini dans la définition elle-même? :) –

+0

La première chaîne est le nom du mot-clé, la seconde signifie "chaîne" comme un terme général :) –

3

La signification sémantique de la chaîne est la seconde. La classe String .Net gère un stockage interne (has-a) et peut exposer ce magasin de la manière la plus abstraite possible. La question est comme "Est-ce que la pomme est une chose ronde rouge? Parce que j'ai toujours pensé que c'était un fruit."

0

D'une manière abstraite (et je suppose, lorsqu'il est mis en mémoire) - c'est un tableau de caractères. Corrigez-moi, si j'ai tort de penser cela.

7

Cela dépend de votre définition du mot "chaîne". .NET possède un tableau de caractères en tant que stockage interne (il stocke également la longueur (qui est O (1)), entre autres, par exemple).

Mais la chaîne de mot désigne un événement consécutif de quelque chose en général, ce qui pourrait signifier aussi un tableau de caractères :))

D'ailleurs, quand je l'ai dit le type string a un « tableau de caractères, » Je n » t signifie "un champ de type char[]" spécifiquement. Je voulais dire la signification générale du terme "tableau" en tant que collection ordonnée de quelque chose. :))

0

La chaîne est un nom de classe. Il a des significations différentes dans différentes langues. Il pourrait être unicode ou ASCII en interne ce qui signifie que le mécanisme de stockage est une série d'octets. Cette classe fournit des fonctions pour manipuler son propre stockage interne et elle n'est pas destinée à être directement accédée et modifiée du fait qu'elle peut contenir des caractères dans une variété d'encodages différents. Donc, dans le but de votre question, il y a un magasin d'octets.

0

Cela dépend de la langue et de l'implémentation. Au niveau le plus basique (ascii char * string), il s'agit d'une série séquentielle d'adresses mémoire contenant chacune un int court correspondant à un code ASCII et terminé par null (char (0)). La plupart des langages de plus haut niveau fournissent un objet chaîne qui a un tableau de caractères ainsi que des méthodes de commodité parce que travailler avec des chaînes de caractère est plus ou moins une douleur à l'arrière.

+0

Si vous lisez la question et que vous voulez dire en réalité que cela dépend du langage ".Net", alors vous avez tort ... ce n'est pas le cas ... Toutes les chaînes .net, quelle que soit la langue, sont les mêmes. Net Common Type System (CTS) ... –

0

Cela dépend exactement de la façon dont vous le regardez. Si vous l'épinglez avec un GCHandle puis regardez la mémoire où il se trouve, vous voyez qu'il s'agit en fait d'un descripteur de 32 bits suivi immédiatement d'un tableau de caractères Unicode (sachez que AddrOfPinnedObject vous donnera l'adresse du premier caractère, pas la longueur.S'il a donné l'adresse de la longueur, il serait beaucoup moins utile pour P/Invoquant).

0

Fonctionnellement, une chaîne est une liste, ou une séquence, de caractères. Les chaînes sont souvent stockées de manière transparente sous la forme de tableaux de caractères (par exemple, en C), de sorte que nous nous référons souvent à eux de cette façon. Les tableaux permettent un accès aléatoire pratique aux caractères, ce qui est important pour certains algorithmes. À d'autres fins, cependant, stocker des chaînes Unicode en UTF-8 pourrait être la forme la plus appropriée. Notez que, bien qu'il soit stocké dans un tableau d'octets, il n'y a plus de correspondance biunivoque entre les octets et les caractères: vos algorithmes de chaîne doivent généralement accéder aux caractères séquentiellement depuis le début - sous la forme d'une liste.

La morale de cette histoire est: votre code de chaîne ne devrait exiger un accès aléatoire que s'il en a vraiment besoin. Vous pourriez être surpris de voir à quel point vous avez rarement besoin d'un tableau de personnages.

Questions connexes