En de Microsoft .NET Framework , el sistema de tipos común ( CTS ) es un estándar que especifica cómo tipo definiciones y valores específicos de tipos están representados en la memoria del ordenador. Su objetivo es permitir que los programas escritos en diferentes lenguajes de programación compartan información fácilmente. Como se usa en lenguajes de programación , un tipo puede describirse como una definición de un conjunto de valores (por ejemplo, "todos los enteros entre 0 y 10") y las operaciones permitidas en esos valores (por ejemplo, suma y resta).
La especificación para el CTS está contenida en el estándar 335 de Ecma , "Particiones I a VI de Common Language Infrastructure (CLI)". La CLI y la CTS fueron creadas por Microsoft, y el marco de Microsoft .NET es una implementación del estándar.
Funciones del sistema de tipo común
- Establecer un marco que ayude a habilitar la integración entre idiomas, la seguridad de tipos y la ejecución de código de alto rendimiento.
- Proporcionar un modelo orientado a objetos que admita la implementación completa de muchos lenguajes de programación.
- Definir reglas que deben seguir los lenguajes, lo que ayuda a garantizar que los objetos escritos en diferentes lenguajes puedan interactuar entre sí.
- El CTS también define las reglas que aseguran que los tipos de datos de los objetos escritos en varios idiomas puedan interactuar entre sí.
- El CTS también especifica las reglas para la visibilidad de tipos y el acceso a los miembros de un tipo, es decir, el CTS establece las reglas por las cuales los ensamblados forman el alcance de un tipo, y Common Language Runtime hace cumplir las reglas de visibilidad.
- El CTS define las reglas que rigen la herencia de tipos , los métodos virtuales y la vida útil de los objetos.
- Los lenguajes admitidos por .NET pueden implementar todos o algunos tipos de datos comunes ...
Al redondear valores fraccionarios, el método de mitad a par ("banquero") se utiliza de forma predeterminada en todo el Marco. Desde la versión 2, el "Redondeo aritmético simétrico" (redondear las mitades desde cero) también está disponible por opción del programador. [1]
- se usa para comunicarse con otros idiomas
Categorías de tipo
El sistema de tipos comunes admite dos categorías generales de tipos:
- 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 en línea en una estructura. Los tipos de valor pueden ser incorporados (implementados por el tiempo de ejecución), definidos por el usuario o enumeraciones.
- Tipos de referencia
- Los tipos de referencia almacenan una referencia a la dirección de memoria del valor y se asignan en el montón . Los tipos de referencia pueden ser tipos autodescriptivos, tipos de puntero o tipos de interfaz. El tipo de un tipo de referencia se puede determinar a partir de valores de tipos autodescriptivos. Los tipos de autodescripción se dividen en matrices y tipos de clases. Los tipos de clase son clases definidas por el usuario, tipos de valor en caja y delegados.
El siguiente ejemplo escrito en Visual Basic .NET muestra la diferencia entre los tipos de referencia y los tipos de valor:
Sistema de ImportacionesClase Class1 Valor público como entero = 0 Finalizar clase 'Class1 Clase Prueba 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 . Valor = 123 Consola . WriteLine ( "Valores: {0}, {1}" , val1 , val2 ) Consola . WriteLine ( "Refs: {0}, {1}" , ref1 . Value , ref2 . Value ) End Sub 'Main End Class ' Prueba
La salida del ejemplo anterior
Valores: 0, 123Refs: 123, 123
Boxeo y unboxing
Boxeo
La conversión de tipos de valor en tipos de referencia también se conoce como boxing . Como se puede ver en el ejemplo siguiente, no es necesario decirle al compilador que un Int32 está encajado en un objeto, porque se encarga de esto por sí mismo.
Int32 x = 10 ; objeto o = x ; // Consola de boxeo implícita . WriteLine ( "El objeto o = {0}" , o ); // imprime "El Objeto o = 10"
Sin embargo, un Int32 siempre se puede encuadrar explícitamente de esta manera:
Int32 x = 10 ; objeto o = ( objeto ) x ; // Consola de boxeo explícito . WriteLine ( "El objeto o = {0}" , o ); // imprime "El objeto o = 10"
Desembalaje
El siguiente ejemplo pretende mostrar cómo desempaquetar un tipo de referencia de nuevo a un tipo de valor. Primero, un Int32 se encajona a un objeto, y luego se desempaqueta de nuevo. Tenga en cuenta que el desempaquetado requiere un reparto explícito.
Int32 x = 5 ; objeto o1 = x ; // Boxeo implícito x = ( int ) o1 ; // Unboxing explícito