Compartir a través de


Información general acerca del sistema de tipos común

Actualización: noviembre 2007

En esta sección se describen los conceptos y se definen los términos que le ayudarán a comprender la implementación del sistema de tipos común de su lenguaje y a trabajar con él.

Clasificación de tipos

El sistema de tipos común es compatible con dos categorías generales de tipos, que a su vez se dividen en subcategorías:

  • Tipos de valor

    Los tipos de valor contienen directamente sus datos y las instancias de los tipos de valor se asignan en la pila o se asignan en línea en una estructura. Los tipos de valor pueden ser integrados (implementados por el motor en tiempo de ejecución), definidos por el usuario o enumeraciones. Para obtener una lista de los tipos de valor integrados, vea Biblioteca de clases de .NET Framework.

  • Tipos de referencia

    Los tipos de referencia guardan una referencia a la dirección en memoria del valor y se asignan en el montón. Los tipos de referencia pueden ser tipos autodescriptivos, de puntero o de interfaz. El tipo de un tipo de referencia se puede determinar a partir de los valores de los tipos autodescriptivos. Los tipos autodescriptivos se dividen en matrices y tipos de clase. Los tipos de clase son clases definidas por el usuario, tipos de valor a los que se ha aplicado la conversión boxing y delegados.

Las variables que son tipos de valor tienen, cada una, su propia copia de los datos y, por lo tanto, las operaciones en una variable no afectan a las demás. Las variables que son tipos de referencia pueden hacer referencia al mismo objeto y, por lo tanto, las operaciones en una variable pueden afectar al mismo objeto al que hace referencia otra variable.

Todos los tipos derivan del tipo base System.Object.

En el siguiente ejemplo se muestra la diferencia entre los tipos de referencia y los tipos de valor.

Class Class1
    Public Value As Integer = 0
End Class 'Class1

Class Test
    
    Shared Sub Main()
        Dim val1 As Integer = 0
        Dim val2 As Integer = val1
        val2 = 123
        Dim ref1 As New Class1()
        Dim ref2 As Class1 = ref1
        ref2.Value = 123
        Console.WriteLine("Values: {0}, {1}", val1, val2)
        Console.WriteLine("Refs: {0}, {1}", ref1.Value, ref2.Value)
    End Sub 'Main
End Class 'Test
using System;
class Class1
{
public int Value = 0;
}
class Test
{
    static void Main() {
        int val1 = 0;
        int val2 = val1;
        val2 = 123;
        Class1 ref1 = new Class1();
        Class1 ref2 = ref1;
        ref2.Value = 123;
        Console.WriteLine("Values: {0}, {1}", val1, val2);
        Console.WriteLine("Refs: {0}, {1}", ref1.Value, ref2.Value);
    }
}

Los resultados de este programa son los siguientes:

Values: 0, 123
Refs: 123, 123

El diagrama siguiente ilustra cómo se relacionan estos distintos tipos. Tenga en cuenta que las instancias de los tipos pueden ser simplemente tipos de valor o tipos autodescriptivos, aunque haya subcategorías de estos tipos.

Clasificación de tipos

Sistema de tipos comunes

Para obtener más información sobre cada tipo, vea tipos de valor, enumeraciones, clases, delegados, matrices, interfaces y punteros.

Valores y objetos

Los valores son representaciones binarias de datos y los tipos proporcionan una forma de interpretar estos datos. Un tipo de valor se almacena directamente como una representación binaria de los datos del tipo. El valor de un tipo de referencia es la ubicación de la secuencia de bits que representa los datos del tipo.

Cada valor tiene un tipo exacto que define por completo la representación del valor y las operaciones definidas en el valor. Los valores de los tipos autodescriptivos se denominan objetos. Si bien siempre se puede determinar el tipo exacto de un objeto examinando su valor, ello no se puede hacer con tipo de valor o un tipo de puntero. Un valor puede tener más de un tipo. El valor de un tipo que implementa una interfaz es también un valor de ese tipo de interfaz. De la misma manera, el valor de un tipo derivado de un tipo base es también un valor de ese tipo base.

Tipos y ensamblados

El motor de tiempo en ejecución utiliza ensamblados para ubicar y cargar tipos. El manifiesto del ensamblado contiene la información que el motor en tiempo de ejecución utiliza para resolver todas las referencias a tipos hechas dentro del ámbito del ensamblado.

Un nombre de tipo del motor en tiempo de ejecución tiene dos partes lógicas: el nombre del ensamblado y el nombre del tipo que se encuentra en el ensamblado. Dos tipos que tengan el mismo nombre pero estén en ensamblados distintos se definen como dos tipos diferentes.

Los ensamblados proporcionan coherencia entre el ámbito de los nombres que ve el programador y el que ve el sistema del motor en tiempo de ejecución. Los programadores escriben tipos en el contexto de un ensamblado. El contenido del ensamblado que está creando un programador establece el ámbito de los nombres que estarán disponibles en tiempo de ejecución.

Tipos y espacios de nombres

Desde el punto de vista del motor en tiempo de ejecución, un espacio de nombres no es más que una colección de nombres de tipos. Algunos lenguajes pueden tener construcciones y la sintaxis correspondiente que ayudan a los programadores a formar grupos lógicos de tipos, pero el motor en tiempo de ejecución no utiliza estas construcciones al enlazar tipos. Así, las clases Object y String forman parte del espacio de nombres System, pero el motor en tiempo de ejecución sólo reconoce los nombres completos de cada tipo, que son System.Object y System.String respectivamente.

Se puede generar un único ensamblado que exponga tipos que parezcan proceder de dos espacios de nombres jerárquicos distintos, como System.Collections y System.Windows.Forms. También se pueden crear dos ensamblados que exporten tipos cuyos nombres contengan MyDll.MyClass.

Si se crea una herramienta para representar los tipos de un ensamblado como pertenecientes a un espacio de nombres jerárquico, la herramienta debe enumerar los tipos de un ensamblado o grupo de ensamblados y analizar los nombres de tipo para generar una relación jerárquica.

Vea también

Conceptos

Información general de la biblioteca de clases de .NET Framework

Common Language Specification

Otros recursos

Ensamblados en Common Language Runtime

Sistema de tipos comunes

Common Language Runtime

Metadatos y componentes autodescriptivos

Interoperabilidad entre lenguajes