¿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;
¿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;
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 aX
oXAttribute
. 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 denominadaXAttributeAttribute
!). Si se retira la declaración de la claseX
, entonces ambos atributos se refieren a la clase de atributo llamadoXAttribute
, 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 {}
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]
, peroDllImportAttribute
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 {}
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.
Usted dijo que esta es una convención en .NET Framework, entonces, ¿por qué debería distinguir entre C# y VB.NET? – serhio
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
@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
Personalmente, para mí no está muy claro qué tipo de "atajo" puede proporcionar un compilador. – serhio