c# - inherited - Si una estructura no puede heredar otra clase o estructura, ¿por qué Int32 tiene un método ToString()?
struct c# ejemplos (3)
Si una estructura no puede heredar alguna clase o estructura,
Esto no es cierto Todas las estructuras (y los tipos de valor integrados, como System.Int32
, System.Single
, etc.) siempre heredan implícitamente de System.ValueType
(que, a su vez, hereda de System.Object
).
Sin embargo, no puedes hacer una estructura que herede de otra cosa .
Esto se explica claramente en la especificación de lenguaje C #, 4.1.1:
4.1.1 El tipo System.ValueType
Todos los tipos de valor heredan implícitamente de la clase System.ValueType, que, a su vez, hereda del objeto de clase. No es posible que ningún tipo se derive de un tipo de valor y, por lo tanto, los tipos de valor están sellados implícitamente (§10.1.1.2).
Luego, más adelante (4.1.3) la estructura se define explícitamente como un tipo de valor:
4.1.3 Tipos de estructuras
Un tipo de estructura es un tipo de valor que puede declarar constantes, campos, métodos, propiedades, indizadores, operadores, constructores de instancia, constructores estáticos y tipos anidados.
Esta pregunta ya tiene una respuesta aquí:
int a = 2;
Console.WriteLine(a.ToString()); // displays 2
// definition of ToString() here - public override string ToString();
Ahora, aquí están algunos de mis entendimientos:
- Todas las clases en .net obtienen un método
ToString()
, que se hereda de la claseObject
. - Una estructura no puede ser derivada de una Clase u otra estructura.
int
es una estructura de tipoInt32
, que obtiene un par deToString()
[With Parameters] de las interfaces que implementa. - También hay una función
ToString()
[sin parámetros] en la estructuraInt32
De acuerdo con http://msdn.microsoft.com/en-us/library/system.int32.tostring.aspx ,
struct Int32 anula el método ValueType.ToString ()
Si una estructura no puede heredar alguna clase o estructura, ¿puede explicar cómo está disponible este método ToString()
para Int32
?
Cada definición de un tipo derivado de ValueType en realidad define dos tipos distintos de cosas en el tiempo de ejecución: un tipo de objeto de pila (que deriva de ValueType
y, a su vez, de Object
, y que contiene información de tipo incrustada) y un tipo de ubicación de almacenamiento ( que no contiene ninguna información de tipo incrustada, sino que requiere que el código que la usa debe tener algún otro medio para saber qué es). Una instancia del tipo de objeto de montón contiene un campo del tipo de ubicación de almacenamiento, y el código que intenta acceder a this
tendrá acceso a ese campo. Si un tipo de valor se convierte implícita o explícitamente a una ubicación de almacenamiento de tipo de referencia, el sistema creará un nuevo objeto de montón con el tipo apropiado y copiará todos los campos públicos y privados del tipo de valor a los campos correspondientes dentro del objeto de montón. Si un objeto de pila se convierte en una ubicación de almacenamiento de tipo valor, todos los campos públicos y privados del objeto de pila se copiarán en la ubicación de almacenamiento de tipo valor.
Si se intenta utilizar cualquier método de Interfaz o Object
en un objeto de pila de un tipo de valor, el método se llamará como cualquier otro método de objeto de pila. Si el intento se realiza en una ubicación de almacenamiento de tipo valor, para cualquier método que no sea GetType
, el compilador generará un código de operación especial "restringido" que informa al tiempo de ejecución del tipo de la ubicación de almacenamiento y le indica a Runtime que llame a la dirección de El método apropiado para ese tipo. Como el compilador tendrá el tipo de ubicación de almacenamiento disponible, y el tiempo de ejecución puede usarlo para encontrar el método apropiado, se puede invocar el método apropiado directamente en la ubicación de almacenamiento, sin tener que crear primero un nuevo objeto de almacenamiento dinámico. GetType
es la única excepción notable; Ya que funciona al examinar la información de tipo incrustada dentro de un objeto, solo puede funcionar en cosas que tienen información de tipo incrustada. En consecuencia, su argumento se convertirá a la forma de objeto de pila antes de la llamada; GetType
podrá examinar la información de tipo incrustada de ese objeto de pila.
Int32
implementa IFormattable
, que define el método ToString