C # Атрибуты и атрибуты местоположения / цели - PullRequest
4 голосов
/ 04 марта 2010

Я читаю об атрибутах и ​​понимаю, что они могут быть применены к различным целевым объектам с вашим кодом - (см. Цели атрибутов ).

Итак, глядя на файл AssemblyInfo.cs в моем проекте, я вижу следующее:

[assembly: AssemblyTitle("AttributesDemo")]
[assembly: AssemblyDescription("")]

Что имеет смысл для меня. Атрибут, целью которого является сборка.

В своем коде я могу добавить атрибут в класс следующим образом:

[MyAttribute]
class MySerialzableClass
{

С MyAttribute, являющимся:

[AttributeUsage (AttributeTargets.All)]
public class MyAttribute : System.Attribute
{
}

Итак, я подумал о выражении assembly: в первом блоке кода. И попробовал это, просто для экспериментов:

[class: MyAttribute]
class MySerialzableClass
{

Это дает предупреждение компилятору:

'class' не является распознанным атрибутом место нахождения. Все атрибуты в этом блоке будут игнорироваться.

Итак, мой вопрос заключается в следующем: почему нужно указывать цель атрибутов для некоторых атрибутов и не требуются или не разрешены для других? Кроме того, для каких из них вы должны это сделать?

Ответы [ 3 ]

5 голосов
/ 04 марта 2010

Вы должны указать цель в случае, если цель не представлена ​​в коде. Я знаю только три цели, сборки, модуля и возврата:

[return: MyAttribute]
public static int meth(

для класса, указывающего класс: чрезмерно, компилятор может понять, что вы имели в виду

4 голосов
/ 03 ноября 2010

Вы можете указать цели атрибута для любого использования атрибута, но обязательны только те, которые не имеют значения по умолчанию (assembly и module). Кроме того, вы должны использовать эти аннотации, когда хотите применить атрибут к цели, отличной от заданной по умолчанию.

Примеры целей не по умолчанию:

[return: MyAttribute]   
public int Method() { ... }

public int Property {
  get;
  [param: MyAttribute] // applies to the parameter to the setter
  set;
}

В вашем примере правильная цель (по умолчанию) - type:

[type: MyAttribute] 
class MySerialzableClass { }
3 голосов
/ 04 марта 2010

Обычно атрибут приходит непосредственно перед тем, на что он влияет, например, на класс или метод. Для атрибутов всей сборки не существует «до», поэтому вы должны указать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...