Подтвердить что ты не робот

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

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

[DataMember]
private int i;
4b9b3361

Ответ 1

В соответствии с С# Language Specification,

По соглашению классы атрибутов называются суффиксом Attribute. Имя атрибута типа type-name может включать или исключать этот суффикс.

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

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

Если класс атрибута найден как с суффиксом, так и без него, возникает неоднозначность и возникает ошибка времени компиляции. Если символ attribute-name записан таким образом, что его самый правый идентификатор является verbatim identifier, то сопоставляется только атрибут без суффикса, что позволяет такая неопределенность должна быть решена.

A "verbatim identifier" - это идентификатор с префиксом @.

Продолжение работы с 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 {}

Атрибут [X] неоднозначен, так как он может ссылаться либо на X, либо на XAttribute. Использование дословного идентификатора позволяет точно указать намерение в таких редких случаях. Атрибут [XAttribute] не является двусмысленным (хотя это было бы, если бы был класс атрибута с именем XAttributeAttribute!). Если объявление для класса X удалено, то оба атрибута относятся к классу атрибутов с именем XAttribute, как показано ниже:

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

Ответ 2

Это одно и то же. [XAttribute] == [X]

from MSDN:

По соглашению все имена атрибутов заканчиваются со словом " Атрибут" на отличать их от других предметов в .NET Framework. Однако вы делаете не нужно указывать атрибут суффикс при использовании атрибутов в коде. Например, [DllImport] эквивалентно до [DllImportAttribute], но DllImportAttribute - это атрибут фактическое имя в .NET Framework.

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

Если класс атрибута найден как с и без этого суффикса, существует двусмысленность, и результаты ошибки компиляции. Если имя атрибута написано так, что его самый правый идентификатор verbatim identifier, то только атрибут без суффикс, что позволяет неопределенность, которую нужно решить:

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

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

По соглашению все имена атрибутов заканчиваются со словом "Атрибут" отличать их от других предметов в .NET Framework. Однако вы делаете не нужно указывать атрибут суффикс при использовании атрибутов в коде. Например, [DllImport] эквивалентен в [DllImportAttribute], но DllImportAttribute - это атрибут фактическое имя в .NET Framework.

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