C # сокращение имени атрибута

20

Как возможно, что атрибуты C # имеют "Атрибут" в своем имени (например, DataMemberAttribute ), но инициализируются без этого суффикса? например:.

[DataMember]
private int i;
    
задан Fabiano 27.01.2010 в 11:03
источник
  • Я бы заметил, что вопрос КАК это возможно, пока не ответил. но я считаю, что он ищет с использованием отражения X ИЛИ X + «Атрибут» для имен. –  serhio 27.01.2010 в 11:22
  • @serhio в соответствии с Антоном Гоголевым - это ярлык, предоставленный компилятором. Этого достаточно для меня в качестве ответа (если это правильно). И он также работает с пользовательскими атрибутами. –  Fabiano 27.01.2010 в 11:30
  • Лично для меня не совсем понятно, какой «ярлык» может предоставить компилятор. –  serhio 27.01.2010 в 12:13
  • @serhio - возможно, меньше названия для переноса? Это кажется немного непоследовательным (компилятор удаляет «класс» из суффикса имени класса?), Но по крайней мере это имеет смысл. –  StingyJack 03.01.2012 в 16:33

3 ответа

20

Согласно спецификации языка C # ,

By convention, attribute classes are named with a suffix of Attribute. An attribute-name of the form type-name may either include or omit this suffix.

Это ярлык, предоставляемый компилятором C # и никоим образом не являющийся функцией CLR. Другим примером особой обработки атрибутов компилятором является атрибут ObsoleteAttribute : это вызывает компилятор для выдачи предупреждения / ошибки, но он не имеет особого значения для CLR.

Что касается разрешения атрибутов, см. ссылку выше. Подводя итог:

If an attribute class is found both with and without this suffix, an ambiguity is present, and a compile-time error results. If the attribute-name is spelled such that its right-most identifier is a verbatim identifier, then only an attribute without a suffix is matched, thus enabling such an ambiguity to be resolved.

«Идентификатор дословно» - это идентификатор с префиксом @ .

Продолжаем с 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 {}

The attribute [X] is ambiguous, since it could refer to either X or XAttribute. Using a verbatim identifier allows the exact intent to be specified in such rare cases. The attribute [XAttribute] is not ambiguous (although it would be if there was an attribute class named XAttributeAttribute!). If the declaration for class X is removed, then both attributes refer to the attribute class named XAttribute, as follows:

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 {}
    
ответ дан Anton Gogolev 27.01.2010 в 11:08
7

это то же самое. [XAttribute] == [X]

от MSDN :

By convention, all attribute names end with the word "Attribute" to distinguish them from other items in the .NET Framework. However, you do not need to specify the attribute suffix when using attributes in code. For example, [DllImport] is equivalent to [DllImportAttribute], but DllImportAttribute is the attribute's actual name in the .NET Framework.

мы также можем прочитать:

If an attribute class is found both with and without this suffix, an ambiguity is present, and a compile-time error results. If the attribute-name is spelled such that its right-most identifier is a verbatim identifier, then only an attribute without a suffix is matched, thus enabling such an ambiguity to be resolved:

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 {}
    
ответ дан serhio 27.01.2010 в 11:06
3

Это соглашение в C # -компиляторе. Как сказано на MSDN-странице «Использование атрибутов» :

By convention, all attribute names end with the word "Attribute" to distinguish them from other items in the .NET Framework. However, you do not need to specify the attribute suffix when using attributes in code. For example, [DllImport] is equivalent to [DllImportAttribute], but DllImportAttribute is the attribute's actual name in the .NET Framework.

Он работает таким же образом в VB.NET .

    
ответ дан Seb Nilsson 27.01.2010 в 11:10
  • Вы сказали, что это соглашение в .NET Framework, так почему вы должны различать C # и VB.NET? –  serhio 27.01.2010 в 12:10