2013-03-27 2 views
7

Nella specifica C# (17.2) indica che ci sono diversi obiettivi di attributo quando si specifica un attributo. Questo è comune quando è necessario applicare un attributo a qualcosa che spesso non ha un luogo "reale" per specificare un attributo. Ad esempio, l'obiettivo return viene usato spesso nella piattaforma di Invoke:Qual è lo scopo del metodo attributo-obiettivo?

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

Tuttavia ho notato che ci sono altri obiettivi di attributo, come method:

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

In quali circostanze avrei bisogno di definire esplicitamente il method attributo obiettivo (dire per risolvere ambiguità), o è solo lì per motivi di completezza?

risposta

7

In questo caso non è necessario specificare il target (situato direttamente sopra un metodo, method è il target predefinito), è solo lì per completezza. Proprio come non è necessario specificare private quando si aggiungono membri a una classe, ma molte persone lo fanno comunque. E in molti casi i generatori di codice amano essere più espliciti riguardo alle cose.

Inoltre, penso che in casi come questo, l'identificatore aggiuntivo rende le cose un po 'più chiaro:

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

Inoltre, nell'esempio '[Metodo: SomeAttr] evento pubblico Azione MyFieldLikeEvent,', il 'metodo : 'obiettivo non è ridondante. Significa che l'attributo deve essere applicato su entrambi gli accessor generati automaticamente ('add' e' remove'). L'impostazione predefinita sarebbe applicare l'attributo all'evento stesso. –

+0

Credo tu voglia dire che non è necessario specificare 'internal', che è il modificatore di accesso predefinito per i campi non specificati, ecc. – nicholas