2010-01-27 27 views
18

¿Cómo es posible que los atributos C# tengan "Atributo" en su nombre (por ejemplo, DataMemberAttribute) pero se inicializan sin este sufijo? e.g .:Abreviatura de nombre de atributo C#

[DataMember] 
private int i; 
+0

Me gustaría comentar que la pregunta es ** CÓMO ** es posible, no recibió respuesta todavía. pero creo que busca utilizando el reflejo 'X OR X +" Attribute "' para los nombres. – serhio

+0

@serhio según Anton Gogolev es un atajo provisto por el compilador. Esto es suficiente para mí como respuesta (si es correcto). Y también funciona con atributos personalizados. – Fabiano

+0

Personalmente, para mí no está muy claro qué tipo de "atajo" puede proporcionar un compilador. – serhio

Respuesta

19

de acuerdo con la C# Language Specification,

Por convención, el atributo clases se nombran con el sufijo Attribute. Un nombre-atributo del formulario nombre-tipo puede incluir u omitir este sufijo.

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

En cuanto a cómo se resuelven los atributos, consulte el enlace de arriba. Para resumir:

Si se encuentra una clase de atributo con y sin este sufijo, existe una ambigüedad y se produce un error de tiempo de compilación. Si el attribute-name se deletrea de manera que su identificador de la derecha sea verbatim identifier, entonces solo se corresponde un atributo sin sufijo, lo que permite que se resuelva dicha ambigüedad.

Un "identificador de verbatim" 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 ambigua, ya que podría hacer referencia 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 denominada XAttributeAttribute!). Si se retira la declaración de la clase X, entonces ambos atributos se refieren a la clase de atributo llamado 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 {} 
7

esto es lo mismo. [XAttribute] == [X]

de MSDN:

Por convención, todos los nombres de atributos terminan con la palabra "Atributo" a distinguirlos de otros artículos en .NET Framework. Sin embargo, si hace , no necesita especificar el sufijo de atributo al usar atributos en el código. Por ejemplo, [DllImport] es equivalente a [DllImportAttribute], pero DllImportAttribute es el nombre real del atributo en el .NET Framework.

podemos leer también:

Si se encuentra una clase de atributo tanto con y sin este sufijo, una ambigüedad está presente, y un resultados de error de tiempo de compilación. Si el atributo de nombre se escribe tal que su derecho e identificador es un identificador textualmente , entonces sólo un atributo sin un sufijo se corresponde, lo que permite que tales una ambigüedad que resolver:

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 {} 
3

Es una convención en el C# -compiler. Como se dice en la MSDN-page on 'Using Attributes':

Por convención, todos los nombres de atributos terminan con la palabra "Atributo" para distinguirlos de otros artículos en .NET Framework. Sin embargo, si hace , no necesita especificar el sufijo de atributo al usar atributos en el código. Por ejemplo, [DllImport] es equivalente a [DllImportAttribute], pero DllImportAttribute es el nombre real del atributo en el Marco .NET.

Funciona the same way in VB.NET.

+0

Usted dijo que esta es una convención en .NET Framework, entonces, ¿por qué debería distinguir entre C# y VB.NET? – serhio

Cuestiones relacionadas