2009-11-24 2 views
8

Vous cherchez des éclaircissements sur ce ...Les types de valeur (Integer, Decimal, Boolean, etc ...) héritent-ils de Object?

J'ai entendu dire que 'tout' dans .Net hérite de Object. J'ai également entendu dire que la différence entre les types de valeur et les types de référence est que les types de référence héritent de l'objet et que les types de valeur ne le font pas. Ma compréhension était que tout était un objet (hérite de System.Object); mais les types de valeur et les types de référence étaient simplement «différents» les uns des autres. Les types de valeur sont alloués sur la pile et les types de référence obtiennent un 'pointeur' placé sur la pile qui pointe vers une adresse sur le tas.

Est-ce l'essentiel? Qu'est-ce qui fait qu'un entier est un type de valeur? C'est quelque chose d'inhérent à la langue?

+0

« Ce qui fait un un entier type de valeur "- CLR" connaît "les types de valeurs primitives et les gère spécialement, il n'est pas spécifique inhérent au langage (disons C#) – Roman

+3

Les types de valeurs ne sont pas nécessairement alloués sur la pile. Considérons un champ de type valeur dans une classe - l'instance de cette classe serait sur le tas, et donc ce serait le champ. En fait, toute la question de l'allocation est strictement un détail d'implémentation - les types de valeur ont une sémantique de valeur et pas d'identité d'objet inhérente (donc non ===, par exemple), et c'est tout ce qu'il y a à faire. –

+1

duplication possible de [Chaque type dans .net hérite de System.Object?] (Http://stackoverflow.com/questions/1316626/does-every-type-in-net-inherit-from-system-object) – nawfal

Répondre

17

Les types de valeur, tels que Int32, sont des structures.

A partir du fichier d'aide VS 2008 C# (depuis que je l'avais ouvert) sur struct:

Un struct ne peut hériter d'une autre struct ou de la classe, et il ne peut pas être la base d'une classe. Toutes les structures héritent directement de System.ValueType, qui hérite de System.Object.

+3

http://msdn.microsoft.com/en-us/library/ah19swz4(VS.71).aspx –

3

Les types de valeur héritent également de Object, mais pas directement. Ils héritent de ValueType, qui à son tour hérite Object.

+0

Cela serait bien d'avoir une motivation pour le downvote, afin que toutes les erreurs puissent être corrigées. –

2

En résumé, tout ne dérive pas tout de object, il y a des exceptions. Ce billet de blog d'Eric Lippert est probablement la meilleure référence sur ce sujet: "Not everything derives from object"

Tous les struct dérivent implicitement de System.ValueType. La différence entre les types de valeur et les types de référence est un problème sémantique: les types de valeur présentent une sémantique de valeur alors que les types de référence présentent une sémantique de valeur. Les détails de mise en œuvre (tels que l'endroit où ils sont attribués, etc. ne sont pas importants). S, par exemple, sont des types de valeurs car ils sont struct s. Bien sûr, nous modélisons int s comme types de valeur car ils représentent des valeurs et nous voulons des sémantiques de valeurs, pas de sémantiques de référence.

+0

@Downvoter: Vraiment? Vous avez des explications à faire avant que je vous fouette le garçon. – jason

5

Selon Red Gate's .NET Reflector ils héritent (indirectement) de l'objet.

  • Object -> ValueType -> int32
  • Object -> ValueType -> booléen
  • Object -> ValueType -> décimal
  • Object -> ValueType -> octet
  • objet -> ValueType -> char
  • objet -> ValueType -> uint32

Je n'ai pas vérifié d'autres types, mais il woul d semblent-ils faire. Je vous recommande vivement d'avoir Reflector - c'est un téléchargement gratuit et il vous aidera à répondre à d'innombrables autres questions sur la façon dont les différentes parties du framework .NET sont codées. Certains jours je me demande comment je pourrais vivre sans. La meilleure chose à propos de Reflector est que vous n'avez pas besoin de compter sur l'écriture potentiellement obsolète (ou incorrecte ou mal interprétée) de quelqu'un pour découvrir ce qui se passe vraiment dans le .NET Framework - y compris sur MSDN - pas même le tout-puissant Microsoft est infaillible. La documentation est seulement aussi récente que sa dernière modification. Obtenir vos réponses directement à partir du code est le moins susceptible d'être incorrect - en supposant bien sûr que vous êtes capable de correctement interpet ledit code;)

3

Oui, les types de valeur héritent de Object.

Voir la section Héritage Hiérarchie ici: http://msdn.microsoft.com/en-us/library/system.valuetype.aspx

Les Remarques section dans la même page dit, littéralement:

Les deux types de référence et la valeur sont dérivée de la classe ultime de base Objet.

+0

@Downvoter: un commentaire est le bienvenu si vous downvote. Merci. – CesarGon

2

de MSDN: (http://msdn.microsoft.com/en-us/library/s1ax56ch%28VS.71%29.aspx)

Types de valeur

Les types de valeur sont constitués de deux catégories principales:

* Struct type 
* Enumeration type 

Les types struct contiennent les types struct définis par l'utilisateur et le suivant les types simples intégrés:

* Numeric types 
     o Integral types 
     o Floating-point types 
     o decimal 
* bool 

Caractéristiques principales des types de valeurs

Une variable d'un type de valeur contient toujours une valeur de ce type. L'affectation à une variable d'un type de valeur crée une copie de la valeur affectée, tandis que l'affectation à une variable d'un type de référence crée une copie de la référence mais pas de l'objet référencé.

Tous les types de valeurs sont dérivés implicitement de la classe Object.

Contrairement aux types de référence, il n'est pas possible de dériver un nouveau type à partir d'un type de valeur. Cependant, comme les types de référence, les structures peuvent implémenter des interfaces.

Contrairement aux types de référence, il est impossible qu'un type de valeur contienne la valeur null.

Chaque type de valeur a un constructeur par défaut implicite qui initialise la valeur par défaut de ce type. Pour plus d'informations sur les valeurs par défaut des types de valeur, voir Table des valeurs par défaut.

Caractéristiques principales des types simples

Tous les types simples sont des alias des types .NET Framework. Par exemple, int est un alias de System.Int32. Pour une liste complète des alias, voir la table des types prédéfinis.

Les expressions constantes, dont les opérandes sont toutes des constantes de type simple, sont évaluées au moment de la compilation. Pour plus d'informations, voir 7.15 Expressions constantes.

Les types simples peuvent être initialisés en utilisant des littéraux. Par exemple, 'A' est un littéral de type char et 2001 est un littéral de type int.

12

Cela dépend de la façon dont vous visualisez la terminologie - ce qui dépend de si vous parlez de C# ou de la spécification CLI. Par exemple, dans la spécification CLI sections (ECMA-355) 8.9.8 et 8.9.10 Etat:

types de valeur ne héritent pas, bien que le type est un associé boxed type d'objet et hérite donc d'autres types.

et

Dans leurs types de valeurs de forme Unboxed do pas hériter de tout type. Les valeurs codées doivent hériter directement de System.ValueType à moins qu'elles ne soient énumérations, auquel cas doit hériter de System.Enum. Boxed les types de valeur doivent être scellés.

Donc, du point de vue de la CLI, la réponse à la question est pas. Cependant, regardons la spécification C# - et comme nous sommes dans une ambiance de type ECMA, allons pour cette version (qui est actuellement bloquée en C# 2). Section 11.1.1: États

Tous les types de valeurs héritent implicitement de la classe System.ValueType, qui, à son tour, hérite de la classe object.

Donc, du point de vue de la spécification C#, la réponse est oui .

On pourrait argumenter que vous avez étiqueté votre question ".net" donc nous devrions utiliser la définition CLI; Si vous l'étiez "C#", nous aurions dû utiliser la définition C#. Voyez comme c'est arbitraire? :)

Cependant, cette plongée n'est pas très pratique. La réponse dépend des subtilités des définitions.Il est plus raisonnable de construire une situation intéressante là où c'est important ... alors que voulez-vous faire? Si vous pouvez présenter du code, nous pouvons répondre à des questions sur ce qui va arriver - et c'est plus important que les définitions.

(Oui, ce qui est inhabituel pour moi - en général, la terminologie importe beaucoup pour moi Dans certains cas, cependant, les subtilités sont plus d'une malédiction qu'une bénédiction..)

+0

Man, vous devez sortir plus: D – BenAlabaster

+3

@Ben: "Plus" suggère que je sors actuellement du tout;) –

+0

LOL, bien au moins vous avez eu une sortie cette année à DevDays;) – BenAlabaster

Questions connexes