2013-03-27 2 views
7

В спецификации C# (17.2) указано, что при указании атрибута существует несколько целевых атрибутов. Это часто встречается, когда вам нужно применить атрибут к чему-то, что нередко имеет «реальное» место для указания атрибута. Например, return цель часто используется в платформе Invoke:Какова цель атрибута-объекта метода?

[return: MarshalAs(UnmanagedType.Bool)] 
static extern bool SomeWin32Method(); //Assume this is valid, has a DllImport, etc. 

Однако я заметил, что есть и другие цели атрибутов, как method:

[method: DllImport("somelib.dll")] 
static extern bool SomeWin32Method(); 

При каких обстоятельствах я должен был бы явно определить method атрибут target (скажем, для устранения двусмысленности), или это просто ради полноты?

ответ

7

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

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

[method: SomeAttr] 
[return: SomeOtherAttr] 
int SomeMethod() { return 0; } 
+1

Кроме того, в примере, '[метод: SomeAttr] публичное событие действий MyFieldLikeEvent;', в 'метод : 'target не является избыточным. Это означает, что атрибут должен применяться как к автогенерированным аксессуарам ('add', так и' remove'). По умолчанию было бы применить атрибут к самому событию. –

+0

Я полагаю, вы имеете в виду, что вам не нужно указывать 'internal', который является модификатором доступа по умолчанию для неуказанных полей и т. Д. – nicholas

Смежные вопросы