Compartir a través de


Common Language Specification

Para poder interactuar completamente con otros objetos, sea cual sea el lenguaje en que se hayan implementado, los objetos deben exponer a los llamadores sólo aquellas características que sean comunes para todos los lenguajes con los que deben interoperar. Por este motivo, se ha definido Common Language Specification (CLS), que es un conjunto de características de lenguaje básicas requeridas por la mayoría de las aplicaciones. Las reglas de CLS definen un subconjunto del Sistema de tipos comunes, es decir, todas las reglas que se aplican al sistema de tipos común se aplican también a CLS, salvo que se definan reglas más estrictas en CLS. CLS ayuda a mejorar y garantizar la interoperabilidad entre lenguajes mediante la definición de un conjunto de características en las que se pueden basar los programadores y que están disponibles en una gran variedad de lenguajes. CLS también establece los requisitos de conformidad con CLS; estos requisitos permiten determinar si el código administrado cumple la especificación CLS y hasta qué punto una herramienta dada admite la programación de código administrado que utilice las características de CLS.

Si un componente sólo utiliza las características de CLS en la API que expone a otro código (incluidas las clases derivadas), se garantiza que se puede obtener acceso al componente desde cualquier lenguaje de programación que admita CLS. Los componentes que cumplen las reglas de CLS y usan sólo las características incluidas en CLS se conocen como componentes conformes a CLS.

La mayoría de los miembros definidos por tipos en la Biblioteca de clases de .NET Framework son conformes a CLS. Sin embargo, algunos tipos de la biblioteca de clases tienen uno o más miembros que no son conformes a CLS. Estos miembros permiten el uso de características de lenguaje que no se encuentran en CLS. Los tipos y miembros que no son conformes a CLS se identifican como tales en la documentación de referencia y, en todos los casos, existe una alternativa conforme a CLS. Para obtener más información sobre los tipos de la biblioteca de clases de .NET Framework, vea Biblioteca de clases de .NET Framework.

CLS se diseñó de manera que fuese lo suficientemente amplio como para incluir las construcciones de lenguaje que normalmente necesitan los programadores y lo suficientemente pequeño como para que todos los lenguajes pudieran admitirlo. Además, se ha excluido de CLS cualquier construcción de lenguaje de la que no se puede verificar rápidamente la seguridad de tipos del código, de manera que todos los lenguajes conformes a CLS pueden generar código que es posible comprobar. Para obtener más información sobre la comprobación de la seguridad de tipos, vea Proceso de ejecución administrada.

En la tabla siguiente, se resumen las características que se incluyen en CLS y se indica si cada característica se aplica a programadores y compiladores (Todos) o sólo a compiladores. Se pretende que sea informativa, pero no detallada. Para obtener información detallada, consulte la especificación de Common Language Infrastructure, Partition I, disponible en el sitio web Microsoft Developer Network (MSDN).

Característica

Se aplica a

Descripción

General

   

   

Visibilidad

Todos

Las reglas de CLS se aplican sólo a las partes de un tipo que se expongan fuera del ensamblado que realiza la definición.

Miembros globales

Todos

Los campos y métodos static globales no son conformes a CLS.

Nombres

   

   

Caracteres y mayúsculas

Todos

Los compiladores de lenguaje conformes a CLS deben seguir las reglas del anexo 7 del informe técnico 15 del estándar Unicode 3.0, que controla el conjunto de caracteres que pueden iniciar e incluirse en los identificadores. Este estándar está disponible en el sitio web de Unicode Consortium.

Para que dos identificadores se consideren distintos, deben diferenciarse por algo más que el uso de mayúsculas o minúsculas.

Keywords

Compiladores

Los compiladores de lenguajes conformes a CLS proporcionan un mecanismo para hacer referencia a identificadores que coinciden con palabras clave. Los compiladores de lenguajes conformes a CLS proporcionan un mecanismo para definir y reemplazar los métodos virtuales por nombres que son palabras clave en el lenguaje.

Exclusividad

Todos

Todos los nombres de un ámbito conforme a CLS deben ser distintos, incluso cuando los nombres sean para dos clases de miembros diferentes, excepto cuando los nombres son idénticos y se resuelven mediante sobrecarga. Por ejemplo, CLS no permite que un tipo único use el mismo nombre para un método y un campo.

Prototipos

Todos

Todos los tipos devueltos y los tipos de parámetros que aparecen en un prototipo de tipo o miembro deben ser conformes a CLS.

Tipos

   

   

Tipos primitivos

Todos

La biblioteca de clases de .NET Framework incluye tipos que se corresponden con los tipos de datos primitivos que usan los compiladores. De entre estos tipos, son conformes a CLS los siguientes: Byte, Int16, Int32, Int64, Single, Double, Boolean, Char, Decimal, IntPtr y String. Para obtener más información sobre estos tipos, vea la tabla de tipos de la Biblioteca de clases de .NET Framework.

Tipos encuadrados

Todos

Los tipos de valor encuadrados (tipos de valor que se han convertido en objetos) no son parte de CLS. Utilice en su lugar System.Object, System.ValueType o System.Enum, según corresponda.

Visibilidad

Todos

Las declaraciones de tipos y miembros no deben contener tipos que sean menos visibles o accesibles que el tipo o miembro que se va a declarar.

Métodos de interfaz

Compiladores

Los compiladores de lenguajes conformes a CLS deben incluir sintaxis para el caso de que un tipo único implemente dos interfaces y cada una de esas interfaces requiera la definición de un método con el mismo nombre y el mismo prototipo. Tales métodos se deben considerar distintos y no necesitan tener la misma implementación.

Cierre

Todos

Los miembros individuales de interfaces y clases abstractas conformes a CLS deben definirse para ser conformes a CLS.

Invocación de constructores

Todos

Para poder tener acceso a datos de instancias heredadas, un constructor debe llamar al constructor de la clase base.

Referencias a tipos

Todos

Las referencias a tipos no son conformes a CLS. Una referencia a un tipo es una construcción especial que contiene una referencia a un objeto y una referencia a un tipo. Las referencias a tipos permiten que Common Language Runtime proporcione compatibilidad con los estilos de C++ a los métodos que tienen un número variable de argumentos.

Miembros de tipos

   

   

Sobrecarga

Todos

Se permite la sobrecarga de propiedades indizadas, métodos y constructores; no se deben sobrecargar campos y eventos.

Las propiedades no se deben sobrecargar por tipo (es decir, por el tipo de valor devuelto de su método Get), pero se pueden sobrecargar con números o tipos de índices diferentes.

Sólo se permite la sobrecarga de métodos si se basa en el número y en los tipos de parámetros y, en el caso de los métodos genéricos, si se basa en el número de parámetros genéricos.

La sobrecarga de operadores no se incluye en CLS. Sin embargo, CLS proporciona directrices sobre cómo incluir nombres útiles (como Add()) y cómo establecer un bit en los metadatos. Se recomienda que los compiladores que elijan incluir la sobrecarga de operadores sigan estas directrices, aunque no están obligados a ello.

Exclusividad de miembros de sobrecarga

Todos

Los campos y los tipos anidados deben distinguirse únicamente por comparación de identificador. Los métodos, las propiedades y los eventos que tengan el mismo nombre (por comparación de identificador) deben distinguirse por algo más que el tipo de valor devuelto.

Operadores de conversión

Todos

Si op_Implicit u op_Explicit se sobrecarga sobre el tipo de valor devuelto, se debe incluir una forma alternativa para proporcionar la conversión.

Métodos

   

   

Accesibilidad de los métodos reemplazados

Todos

La accesibilidad no se debe cambiar al reemplazar los métodos heredados, excepto cuando se reemplace un método heredado a partir de un ensamblado diferente con accesibilidad FamilyOrAssembly. En este caso, el reemplazo debe tener accesibilidad Family.

Listas de argumentos

Todos

La única convención de llamada admitida por CLS es la convención de llamada administrada estándar; no se permiten las listas de argumentos de longitud variable. (Utilice la palabra clave ParamArray de Microsoft Visual Basic y la palabra clave params de C# para permitir un número variable de argumentos.)

Propiedades

   

   

Metadatos de descriptor de acceso

Compiladores

Los métodos Get y Set que implementan los métodos de una propiedad se marcan con el identificador mdSpecialName en los metadatos.

Modificadores

Todos

La propiedad y sus descriptores de acceso deben ser static, virtual o instance.

Nombres de descriptores de acceso

Todos

Las propiedades deben seguir los patrones de nombres específicos. Para una propiedad denominada Name, el método Get, si se define, se denominará get_Name y el método Set, si se define, se denominará set_Name.

Tipo de valor devuelto y argumentos

Todos

El tipo de la propiedad es el tipo de valor devuelto del método Get y el tipo del último argumento del método Set. Los tipos de los parámetros de la propiedad son los tipos de los parámetros del método Get y los tipos de todos los parámetros del método Set, excepto el último. Todos estos tipos deben ser conformes a CLS y no pueden ser punteros administrados; no deben pasarse por referencia.

Eventos

   

   

Métodos de evento

Todos

Los métodos para agregar y quitar un evento deben estar ambos presentes o ausentes.

Metadatos de los métodos de evento

Compiladores

Los métodos que implementen un evento deben marcarse con el identificador mdSpecialName en los metadatos.

Accesibilidad del descriptor de acceso

Todos

La accesibilidad de los métodos para agregar, quitar y provocar un evento debe ser idéntica.

Modificadores

Todos

Los métodos para agregar, quitar y provocar un evento deben ser static, virtual o instance.

Nombres de los métodos de evento

Todos

Los eventos deben seguir los patrones de nombres específicos. Para un evento denominado MyEvent, el método Add, si se define, se denominará add_MyEvent, el método Remove, si se define, se denominará remove_MyEvent y el método Raise se denominará raise_MyEvent.

Argumentos

Todos

Los métodos que se utilizan para agregar y quitar un evento deben tomar un parámetro cuyo tipo defina el tipo del evento, y ese tipo debe derivarse de System.Delegate.

Tipos de puntero

   

   

Punteros

Todos

Los tipos de puntero y los tipos de puntero a función no son conformes a CLS.

Interfaces

   

   

Prototipos de miembros

Todos

Las interfaces conformes a CLS no deben requerir la definición de métodos no conformes a CLS para su implementación.

Modificadores de miembros

Todos

Las interfaces conformes a CLS no pueden definir métodos estáticos ni pueden definir campos. Pueden definir propiedades, eventos y métodos virtuales.

Tipos de referencia

   

   

Invocación de constructores

Todos

Para los tipos de referencia, se llama a los constructores de objetos sólo como parte de la creación de un objeto, y los objetos se inicializan una sola vez.

Tipos de clase

   

   

Herencia

Todos

Las clases conformes a CLS deben heredarse de clases conformes a CLS (System.Object es conforme a CLS).

Matrices1

   

   

Tipos de elemento

Todos

Los elementos de matriz deben ser tipos conformes a CLS.

Dimensiones

Todos

Las matrices deben tener un número fijo de dimensiones, es decir, tienen que ser mayores que cero.

Límites

Todos

Todas las dimensiones de una matriz deben tener un límite menor que cero.

Enumeraciones

   

   

Tipo subyacente

Todos

El tipo subyacente de una enumeración debe ser un tipo entero integrado en CLS (Byte, Int16, Int32 o Int64).

FlagsAttribute

Compiladores

La presencia del atributo personalizado System.FlagsAttribute en la definición de una enumeración indica que la enumeración debe tratarse como un conjunto de campos de bits (marcadores), y la ausencia de este atributo indica que el tipo debe verse como un grupo de constantes enumeradas. Se recomienda que en los lenguajes se utilice FlagsAttribute o sintaxis específica del lenguaje para distinguir estos dos tipos de enumeraciones.

Miembros de campo

Todos

Los campos static literales de una enumeración deben ser del mismo tipo que el tipo de la enumeración.

Excepciones

   

   

Herencia

Todos

Los objetos que se produzcan deberán ser de tipo System.Exception o heredarse de System.Exception.

Atributos personalizados

   

   

Codificaciones de valores

Compiladores

Los compiladores conformes a CLS deben tratar sólo un subconjunto de las codificaciones de los atributos personalizados (la representación de los atributos personalizados en los metadatos). Los únicos tipos que pueden aparecer en estas codificaciones son: System.Type, System.String, System.Char, System.Boolean, System.Byte, System.Int16, System.Int32, System.Int64, System.Single, System.Double y cualquier tipo de enumeración basado en un tipo entero base conforme a CLS.

Metadatos

   

   

Conformidad con CLS

Todos

Los tipos que tienen una conformidad con CLS distinta a la del ensamblado en el que se definen deberán marcarse correspondientemente mediante System.CLSCompliantAttribute. De manera similar, los miembros cuya conformidad con CLS sea diferente de la de su tipo también se deben marcar. Si un miembro o tipo está marcado como no conforme a CLS, debe proporcionarse una alternativa conforme a CLS.

Genéricos

Nombres de tipo

Compiladores

El nombre de un tipo genérico debe codificar el número de parámetros de tipo declarados en el tipo. El nombre de un tipo genérico anidado debe codificar el número de parámetros de tipo recién introducidos en el tipo.

Tipos anidados

Compiladores

Los tipos anidados deben tener, como mínimo, el mismo número de parámetros genéricos que el tipo contenedor. Los parámetros genéricos de un tipo anidado se corresponden por posición con los parámetros genéricos del tipo contenedor.

Restricciones

Todos

Todo tipo genérico deberá declarar restricciones suficientes como para garantizar que cualquier restricción de las interfaces o del tipo base se vea satisfecha por las restricciones del tipo genérico.

Tipos de restricción

Todos

Los tipos que se utilizan como restricciones en parámetros genéricos deberán ser conformes a CLS.

Prototipos de miembros

Todos

Se entiende que la visibilidad y accesibilidad de los miembros (incluidos los tipos anidados) de un tipo genérico del que se ha creado una instancia quedan restringidas al ámbito específico de creación de instancias, y no a la declaración de tipos genéricos en general.

Métodos genéricos

Todos

Cada método genérico abstracto o virtual deberá tener su propia implementación concreta (no abstracta) predeterminada

1. La matrices escalonadas, es decir, matrices de matrices son conformes a CLS. En la versión 1.0 de .NET Framework, el compilador de C# informa erróneamente de que no lo son.

Vea también

Conceptos

Interoperabilidad entre lenguajes