Compartir a través de


¿Qué es 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 común, es decir, todas las reglas aplicables al sistema de tipos común se aplican a CLS, excepto cuando 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 compatibilidad 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 compatibles con CLS.

La mayoría de los miembros definidos por los tipos de la biblioteca de clases de .NET Framework son compatibles con CLS. Sin embargo, algunos tipos de la biblioteca de clases tienen uno o más miembros que no son compatibles con CLS. Estos miembros permiten el uso de características de lenguaje que no se encuentran en CLS. Los tipos y miembros que no son compatibles con CLS se identifican como tales en la documentación de referencia y, en todos los casos, existe una alternativa compatible con CLS. Para obtener más información acerca de los tipos de la biblioteca de clases de .NET Framework, vea Referencia 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 compatibles con 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 Compilación Just-in-time.

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, vea la especificación de Common Language Infrastructure, Partition I, que se encuentra en el directorio Guía para desarrolladores de herramientas que se instala con Microsoft .NET Framework SDK.

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 compatibles con CLS.
Nombres        
Caracteres y mayúsculas
Todos Los compiladores de lenguaje compatibles con 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 www.unicode.org/unicode/reports/tr15/tr15-18.html.

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

Palabras clave
Compiladores Los compiladores de lenguajes compatibles con CLS proporcionan un mecanismo para hacer referencia a identificadores que coinciden con palabras clave. Los compiladores de lenguajes compatibles con 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 compatible con 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 compatibles con 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. Entre estos tipos, los siguientes son compatibles con CLS: 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 en 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. En su lugar, utilice 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 compatibles con 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 compatibles con CLS deben definirse para ser compatibles con 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 compatibles con 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 devuelto de su método Get), pero se pueden sobrecargar con números o tipos de índices diferentes.

Los métodos se pueden sobrecargar únicamente en función del número y de los tipos de sus parámetros.

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 decidan 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 devuelto.
Operadores de conversión
Todos Si op_Implicit u op_Explicit se sobrecarga sobre el tipo 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. (Use 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.
Accesibilidad del descriptor de acceso
Todos La accesibilidad de la propiedad y la de sus descriptores de acceso debe ser idéntica.
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 devuelto y argumentos
Todos El tipo de la propiedad es el tipo 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 compatibles con 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 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 compatibles con CLS.
Interfaces        
Prototipos de miembros
Todos Las interfaces compatibles con CLS no deben requerir la definición de métodos no compatibles con CLS para su implementación.
Modificadores de miembros
Todos Las interfaces compatibles con 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 Una clase compatible con CLS debe heredarse de una clase compatible con CLS (System.Object es compatible con CLS).
Matrices        
Tipos de elemento
Todos Los elementos de matriz deben ser tipos compatibles con CLS.
Dimensiones
Todos Las matrices deben tener un número fijo de dimensiones, 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 debería tratarse como un conjunto de campos de bits (indicadores), y la ausencia de este atributo indica que el tipo debería 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 iniciados deben ser de tipo System.Exception o heredar de System.Exception.
Atributos personalizados        
Codificaciones de valores
Compiladores Los compiladores compatibles con 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 compatible con CLS.
Metadatos        
Compatibilidad con CLS
Todos Los tipos cuya compatibilidad con CLS sea diferente de la del ensamblado en el que están definidos deben marcarse de la forma correspondiente mediante System.CLSCompliantAttribute. De manera similar, los miembros cuya compatibilidad con CLS sea diferente de la de su tipo también se deben marcar. Si un miembro o tipo está marcado como no compatible con CLS, debe proporcionarse una alternativa compatible con CLS.

Vea también

Interoperabilidad entre lenguajes | Información general acerca de la interoperabilidad entre lenguajes