Abreviatura del nombre del atributo C #

¿Cómo es posible que los atributos de C # tengan “Atributo” en su nombre (por ejemplo, DataMemberAttribute ) pero se inicialicen sin este sufijo? p.ej:

 [DataMember] private int i; 

De acuerdo con la especificación del lenguaje C # ,

Por convención, las clases de atributos se nombran con un sufijo de Attribute . Un nombre de atributo de la forma nombre-tipo puede incluir u omitir este sufijo.

Este es un acceso directo proporcionado por el comstackdor de C # y de ninguna manera una característica de CLR. Otro ejemplo de tratamiento especial de los atributos por parte del comstackdor es un atributo ObsoleteAttribute : este obliga al comstackdor a emitir una advertencia / error, pero no tiene un significado especial para el CLR.

En cuanto a cómo se resuelven los atributos, mira el enlace de arriba. En resumen:

Si se encuentra una clase de atributo con y sin este sufijo, existe una ambigüedad y se produce un error de tiempo de comstackción. Si el attribute-name se deletrea de manera que su identificador que está más a la derecha sea un identificador literal , entonces solo se hace coincidir un atributo sin sufijo, lo que permite que se resuelva dicha ambigüedad.

Un “identificador literal” es un identificador con un prefijo @ .

Continuando con MSDN:

 using System; [AttributeUsage(AttributeTargets.All)] public class X: Attribute {} [AttributeUsage(AttributeTargets.All)] public class XAttribute: Attribute {} [X] // Error: ambiguity class Class1 {} [XAttribute] // Refers to XAttribute class Class2 {} [@X] // Refers to X class Class3 {} [@XAttribute] // Refers to XAttribute class Class4 {} 

El atributo [X] es ambiguo, ya que podría referirse a X o XAttribute . El uso de un identificador literario permite especificar la intención exacta en casos tan raros. El atributo [XAttribute] no es ambiguo (aunque lo sería si hubiera una clase de atributo llamada XAttributeAttribute !). Si se elimina la statement para la clase X , ambos atributos se refieren a la clase de atributo denominada XAttribute , de la siguiente manera:

 using System; [AttributeUsage(AttributeTargets.All)] public class XAttribute: Attribute {} [X] // Refers to XAttribute class Class1 {} [XAttribute] // Refers to XAttribute class Class2 {} [@X] // Error: no attribute named "X" class Class3 {} 

esta es la misma cosa [XAttribute] == [X]

de MSDN :

Por convención, todos los nombres de atributos terminan con la palabra ” Atributo ” para distinguirlos de otros elementos en .NET Framework. Sin embargo, no necesita especificar el sufijo de atributo cuando usa atributos en el código. Por ejemplo, [DllImport] es equivalente a [DllImportAttribute] , pero DllImportAttribute es el nombre real del atributo en .NET Framework.

también podemos leer:

Si se encuentra una clase de atributo con y sin este sufijo, existe una ambigüedad y se produce un error de tiempo de comstackción. Si el nombre-atributo se deletrea de manera que su identificador que está más a la derecha sea un identificador literal, entonces solo se hace coincidir un atributo sin sufijo, lo que permite que se resuelva dicha ambigüedad:

 using System; [AttributeUsage(AttributeTargets.All)] public class X: Attribute {} [AttributeUsage(AttributeTargets.All)] public class XAttribute: Attribute {} [X] // Error: ambiguity class Class1 {} [XAttribute] // Refers to XAttribute class Class2 {} [@X] // Refers to X class Class3 {} [@XAttribute] // Refers to XAttribute class Class4 {} 

Es una convención en el comstackdor de C #. Como dice en la página MSDN en ‘Usar atributos’ :

Por convención, todos los nombres de atributos terminan con la palabra “Atributo” para distinguirlos de otros elementos en .NET Framework. Sin embargo, no necesita especificar el sufijo de atributo cuando usa atributos en el código. Por ejemplo, [DllImport ] es equivalente a [DllImportAttribute] , pero DllImportAttribute es el nombre real del atributo en .NET Framework.

Funciona de la misma manera en VB.NET .