9
votes

Quelles sont les différences entre les types de valeur et les types de référence en C #?

Je connais quelques différences,

  1. Les types de valeur sont stockés sur la pile où les types de référence sont stockés sur le tas géré.
  2. Les variables de type de valeur contiennent directement leurs valeurs où les variables de référence ne contiennent qu'une référence à l'emplacement de l'objet créé sur le tas géré.

    Y a-t-il une autre différence que j'ai manquée ... Si oui, que sont-ils?


5 commentaires

Demandé plusieurs fois déjà sur alors ....


@Whate, recherche rapide, non, cette question n'a pas été posée ni répondu directement.


Je n'ai pas le temps de répondre pleinement au moment - mais j'aimerais simplement souligner que "les types de valeurs sont stockés sur la pile" est une surestimation. Voir POBOX.COM/~SKEET/CSHARP/MEMORY.HTML . Pour plus d'informations sur les types de référence VS Types de valeur, voir POBOX.COM/~SKEET/CSHARP/FERFERENCES. HTML


@strager - Le phrasé est légèrement différent mais le sujet est couvert de nombreux endroits. Par exemple Stackoverflow.com/Questtions/1130468/...


Les types de valeur peuvent être stockés sur le tas lorsque la boîte msdn.microsoft.com/fr- US / Bibliothèque / YZ2BE5WK.ASPX


4 Réponses :


22
votes

Veuillez lire: La pile est un détail de mise en œuvre , et ne répétez jamais plus jamais le canard que l'allocation de pile est ce qui différencie les types de valeur des types de référence. Notre. Le CLR peut choisir d'allouer une variable partout où elle veut.

La différence la plus importante est dans la sémantique de l'affectation. Lorsque vous attribuez une valeur de valeur à une variable (ou transmettez-la à une méthode sous forme d'argument), toutes les données sont copiées. Lorsque vous attribuez un type de référence, seule une référence est copiée - les deux références pointent sur la même instance d'objet en mémoire.


1 commentaires

Peu de mots durement, mais hey c'est le meilleur moyen que j'ai appris, comme si tu avais agacé Gandalf et l'attendre à vous expliquer à vous avec une contrariété dans sa voix, ça a tendance à coller = D



2
votes

Comme mentionné par Aaronaught et Eric Blog Post:

N'oubliez pas de la règle, les types de référence vont toujours sur le tas, tandis que les types de valeur vont toujours où ils ont été déclarés? Si un type de valeur est déclaré en dehors d'une méthode, mais à l'intérieur d'un type de référence, il sera placé dans le type de référence sur le tas.


0 commentaires

0
votes

Je pense que les valeurs sont assignées implicitement de la mémoire mais non des types de référence, ils doivent être attribués de la mémoire explicitement


0 commentaires

15
votes

Voici quelques différences supplémentaires:

  1. Les types de valeur ne peuvent pas être hérités, tandis que les types de référence peuvent
  2. Les types de valeur sont implémentés comme une structure, des types de référence en tant que classe
  3. Types de valeur, par défaut, on ne peut pas attribuer de vraies valeurs NULL (la Syntaxe est une solution de contournement et n'entraîne toujours pas une vraie valeur null)
  4. attribution d'une valeur de valeur à une autre variable ou le transmettant sous forme de paramètre dans une méthode, en fait une copie alors qu'avec un type de référence, la variable représente l'emplacement de la mémoire de l'objet
  5. Il s'agit d'une erreur de compilation pour une structure pour déclarer un constructeur sans paramètre explicite, mais il ne s'applique pas à une classe
  6. Il s'agit d'une erreur de compilation pour utiliser l'objet "Cet objet" avant que tous les champs ne soient attribués dans une structure, mais la même chose ne s'applique pas à une classe
  7. Il s'agit d'une erreur de compilation pour une structure pour ne pas attribuer complètement toutes les propriétés de son constructeur, mais la même chose ne s'applique pas à une classe

0 commentaires