49 votes

Est une chaîne d'une valeur de type ou d'un type de référence?

Je ne peux pas trouver une "bonne" explication pour cette...

93voto

Marc Gravell Points 482669
Console.WriteLine(typeof(string).IsClass); // true

C'est un type de référence.

Il ne peut pas être un type de valeur, comme des types de valeur ont besoin d'une taille connue pour la pile etc. Comme une référence de type, de la taille de la référence est connue à l'avance, même si la taille de la chaîne n'est pas.

Il se comporte comme vous vous attendez à une valeur de type à se comporter parce qu'il est immuable; c'est à dire qu'il n'a pas d'* changer une fois créé. Mais il y a beaucoup d'autres immuable de référence-types. Délégué instances, par exemple.

*=sauf pour l'intérieur de la StringBuilder, mais vous ne le verrez plus jamais alors que c'est cela...

17voto

Kevin Points 57797

13voto

Darin Dimitrov Points 528142

11voto

Charles Bretana Points 59899

Les fondamentaux "explication" est basé sur le "quoi" est en fait stockées dans l'emplacement de mémoire allouée lorsque vous "déclarer" la variable pour la chose. Si la valeur réelle de la chose est stocké dans la mémoire de l'emplacement visé par le nom de la variable, alors c'est un type de valeur.

   int x;  // memory allocated to hold Value of x, default value assigned of zero

Si, otoh, que, l'emplacement de mémoire allouée lorsque vous "déclarer", la variable va contenir seulement quelques autre adresse mémoire où la valeur réelle (ou valeurs) sont enregistrées, alors c'est un type de référence.

   MyClass x;  // Memory allocated to hold an address, 
               // default address of null (0) assigned.  
               // NO MEMORY ALLOCATED for x itself

ou, si la déclaration comprend l'initialisation,

   MyClass x = new MyClass();  
     // Now, Memory slot (call it Addr1) is allocated to hold address of x, 
     // more memory (call it Addr2) is allocated to hold a new MyClass object.
     // New MyClass object created, stored in memory Addr2 (on the Heap)
     // Address of new object (Addr2) is stored in Addr1

pour une chaîne, la chaîne est créé sur le Tas, et c'est l'adresse va dans l'emplacement de mémoire allouée pour la variable, c'est donc un type de référence.

5voto

JaredPar Points 333733

String est immuable type de référence qui a certaines qualités qui lui donnent l'apparition occasionnelle d'être un type de la valeur

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X