2009-11-24 9 views
8

Buscando una aclaración sobre esto ...¿Los tipos de valores (Integer, Decimal, Boolean, etc ...) heredan de Object?

He oído que 'todo' en .Net hereda de Object. También escuché que la diferencia entre los tipos de valores y los tipos de referencia es que los tipos de referencia que heredan de los tipos de objetos y valores no.

Según entendí, todo era un objeto (hereda de System.Object); pero los tipos de valores y los tipos de referencia eran simplemente 'diferentes' entre sí. Los tipos de valores se asignan en la pila y los tipos de referencia obtienen un 'puntero' colocado en la pila que apunta a una dirección en el montón.

¿Es eso lo esencial? ¿Qué hace que un Entero sea un tipo de valor? Eso es algo inherente al lenguaje?

+0

"Lo que hace un entero a tipo de valor "- CLR" sabe "sobre tipos de valores primitivos y los maneja especialmente, no es específico inherente al lenguaje (digamos C#) – Roman

+3

Los tipos de valores no están necesariamente asignados en la pila. Considere un campo de tipo de valor en una clase: la instancia de esa clase estaría en el montón, y por lo tanto, sería el campo. De hecho, todo el asunto de la asignación es estrictamente un detalle de implementación: los tipos de valor tienen semántica de valores y ninguna identidad de objeto inherente (por lo que no '==', por ejemplo), y eso es todo. –

+1

posible duplicado de [¿Todos los tipos en .net heredan de System.Object?] (Http://stackoverflow.com/questions/1316626/does-every-type-in-net-inherit-from-system-object) – nawfal

Respuesta

17

Los tipos de valor, como Int32, son estructuras.

Desde el archivo C# ayuda VS 2008 (ya que tuve que abrir) sobre estructuras:

una estructura no puede heredar de otra estructura o clase, y no puede ser la base de una clase. Todas las estructuras heredan directamente de System.ValueType, que hereda de System.Object.

+3

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

3

Los tipos de valores también heredan de Object, pero no directamente. Heredan de ValueType, que a su vez hereda Object.

+0

Sería bueno conseguir una motivación para el downvote, para que cualquier error pueda corregirse. –

2

En resumen, no todo se deriva de object, hay excepciones. Esta publicación del blog de Eric Lippert es probablemente la mejor referencia sobre este tema: "Not everything derives from object"

Todos struct derivan implícitamente de System.ValueType.

La diferencia entre los tipos de valores y los tipos de referencia es un problema semántico: los tipos de valores muestran una semántica de valores mientras que los tipos de referencia muestran una semántica de valores. Los detalles de implementación (como dónde están asignados, etc. no son importantes).

int s, por ejemplo, son tipos de valores porque son struct s. Por supuesto, modelamos int s como tipos de valor porque representan valores y queremos semántica de valores, no semántica de referencia.

+0

@Downvoter: ¿De verdad? Tienes que explicar algo antes de azotarte, muchacho. – jason

5

Según Red Gate's .NET Reflector heredan (indirectamente) del objeto.

  • Objeto -> ValueType -> int32
  • Objeto -> ValueType -> boolean
  • Objeto -> ValueType -> decimal
  • Objeto -> ValueType -> bytes
  • Objeto -> ValueType -> Char
  • objeto -> ValueType -> uint32

no he comprobado otros tipos, pero woul Parece que sí. Recomiendo encarecidamente que obtenga Reflector, es una descarga gratuita y le ayudará a responder innumerables otras preguntas sobre cómo se codifican las distintas partes del framework .NET. Algunos días me pregunto cómo viviría sin eso.

Lo mejor de reflector es que usted no necesita confiar en alguien potencialmente obsoleto (o incorrecta o mal interpretado) escritura descubrir lo que es realmente pasando dentro de .NET Framework - incluyendo que en MSDN - ni siquiera el todopoderoso Microsoft es infalible. La documentación solo está actualizada como su última modificación. Obtener sus respuestas directamente del código es lo menos probable que sea incorrecto, suponiendo, por supuesto, que puede interconectar correctamente dicho código;)

3

Sí, los tipos de valores heredan de Object.

Véase el sección Jerarquía de herencia aquí: http://msdn.microsoft.com/en-us/library/system.valuetype.aspx

Los Observaciones sección en la misma página dice, literalmente:

Ambos tipos de referencia y el valor son derivado de la clase base definitiva Objeto.

+0

@Downvoter: un comentario es bienvenido si baja la votación. Gracias. – CesarGon

2

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

Tipos de valor

Los tipos de valor consisten en dos categorías principales:

* Struct type 
* Enumeration type 

Los tipos struct contienen los tipos struct definidos por el usuario y la siguientes tipos simples incorporados:

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

Características principales de los tipos de valor

Una variable de un tipo de valor siempre contiene un valor de ese tipo. La asignación a una variable de un tipo de valor crea una copia del valor asignado, mientras que la asignación a una variable de un tipo de referencia crea una copia de la referencia pero no del objeto al que se hace referencia.

Todos los tipos de valores se derivan implícitamente de la clase Object.

A diferencia de los tipos de referencia, no es posible derivar un nuevo tipo de un tipo de valor. Sin embargo, al igual que los tipos de referencia, las estructuras pueden implementar interfaces.

A diferencia de los tipos de referencia, no es posible que un tipo de valor contenga el valor nulo.

Cada tipo de valor tiene un constructor predeterminado implícito que inicializa el valor predeterminado de ese tipo. Para obtener información sobre los valores predeterminados de los tipos de valores, consulte Tabla de valores predeterminados.

Características principales de tipos simples

Todos los tipos simples son alias de los tipos de sistema de .NET Framework. Por ejemplo, int es un alias de System.Int32. Para obtener una lista completa de alias, vea Tabla de tipos incorporados.

Las expresiones constantes, cuyos operandos son todas constantes de tipo simple, se evalúan en tiempo de compilación. Para obtener más información, consulte 7.15 Expresiones constantes.

Los tipos simples se pueden inicializar usando literales. Por ejemplo, 'A' es un literal del tipo char y 2001 es un literal del tipo int.

12

Depende de cómo ve la terminología, que depende de si está hablando de C# o de la especificación CLI. Por ejemplo, en la especificación CLI (ECMA-355) secciones 8.9.8 y 8.9.10 estado:

tipos de valor no heredan, aunque el tipo de caja asociado es un tipo de objeto y por lo tanto hereda de otra tipos.

y

En sus tipos de valor de forma unboxed hacer no heredar de cualquier tipo. Los tipos de valores en caja heredarán directamente de System.ValueType a menos que sean enumeraciones , en cuyo caso, heredarán de System.Enum. Los tipos de valor de caja deben sellarse.

Por lo tanto, desde el punto de vista de la CLI, la respuesta a la pregunta es sin.

Sin embargo, echemos un vistazo a la especificación de C#, y como estamos en un estado de ánimo ECMA, vamos por esa versión (que actualmente está atrapada en C# 2). Sección 11.1.1 estados:

Todos los tipos de valor implícito heredan de la clase System.ValueType, el cual, a su vez, hereda de la clase object.

Por lo tanto, desde el punto de vista de la especificación de C#, la respuesta es sí .

Se podría argumentar que etiquetó su pregunta ".net", por lo que deberíamos usar la definición CLI; si lo hubiera etiquetado como "C#" deberíamos haber usado la definición de C#. ¿Ves cuán arbitrario es? :)

Sin embargo, todas estas especificaciones no son demasiado prácticas. La respuesta depende de las complejidades de las definiciones.Es más sensato construir una situación interesante donde importa ... entonces, ¿qué quieres hacer? Si puede presentar algún código, podemos responder preguntas sobre lo que sucederá, y eso es más importante que las definiciones.

(Sí, esto es inusual para mí - en general, la terminología importa mucho para mí En algunos casos, sin embargo, las sutilezas son más una maldición que una bendición..)

+0

Hombre, necesita obtener más información: D – BenAlabaster

+3

@Ben: "Más" sugiere que actualmente salgo;) –

+0

LOL, bueno al menos usted recibió una salida este año para DevDays;) – BenAlabaster

Cuestiones relacionadas