
Types de valeurs C# et héritage
Question :
Comment un type valeur peut-il dériver d'un objet (un type référence) tout en conservant son comportement de type valeur ?
Réponse :
-
C# permet de dériver des structures à partir de classes : Toutes les structures héritent de System.ValueType, qui à son tour hérite de System.Object.
-
La relation d'héritage est simple : Les membres héritables de la classe de base deviennent, par exemple, membres de la structure dérivée, permettant à la structure d'hériter de la méthode ToString.
-
La dérivation n'affecte pas le comportement de copie : Les types valeur sont copiés par valeur, tandis que les types référence sont copiés par référence. L'héritage n'a aucun effet sur cela.
Comment le CLR est géré
Le CLR fait la distinction entre les types valeur et les types référence en fonction de la manière dont ils sont représentés :
-
Les types de valeurs n'ont pas d'en-têtes d'objet ni de blocs de synchronisation : Ils occupent directement l'espace de stockage.
-
Les types de référence ont un en-tête d'objet et éventuellement un bloc de synchronisation : Ils font référence à des données stockées ailleurs.
-
La dérivation ne modifie pas ces représentations : Un type valeur dérivé d'un type référence a toujours une représentation de type valeur. A l’inverse, un type référence dérivé d’un type valeur ne perd pas ses caractéristiques orientées objet.
Exemple :
Considérons une structure de type valeur simple appelée MyStruct :
struct MyStruct : ValueType { }
Copier après la connexion
-
MyStruct hérite de ValueType : ValueType est un type référence, mais MyStruct est toujours un type valeur. Cela signifie :
- Les instances MyStruct sont allouées sur la pile ou dans des variables locales.
- Les instances MyStruct sont copiées par valeur, pas par référence.
-
MyStruct fait implicitement référence à ValueType : Grâce à l'héritage, MyStruct a accès aux membres héritables de ValueType, y compris la méthode ToString.
Conclusion :
Les types de valeur sont dérivés de Object principalement pour accéder aux membres héritables. Cet héritage ne modifie pas leurs caractéristiques de type valeur ni la façon dont ils sont copiés et stockés en mémoire. Le CLR gère ces différences en interne pour garantir que les types valeur conservent leurs caractéristiques uniques.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!