2013-03-27 10 views
7

In der C# -Spezifikation (17.2) gibt es an, dass es mehrere Attributziele gibt, wenn ein Attribut spezifiziert wird. Dies ist üblich, wenn Sie ein Attribut auf etwas anwenden müssen, das nicht oft einen "echten" Platz zum Spezifizieren eines Attributs hat. Zum Beispiel wird das return Ziel oft in Plattform Invoke verwendet:Was ist der Zweck der Methode attribute-target?

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

Jedoch habe ich bemerkt, dass es andere Attribute Ziele, wie method:

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

Unter welchen Umständen würde ich das explizit definieren muß method Attribut Ziel (sagen, um Mehrdeutigkeit aufzulösen), oder ist es nur der Vollständigkeit halber da?

Antwort

7

Sie müssen das Ziel in diesem Fall nicht angeben (befindet sich direkt über einer Methode, method ist das Standardziel), es ist nur der Vollständigkeit halber. Genauso wie Sie beim Hinzufügen von Mitgliedern zu einer Klasse nicht private angeben müssen, aber viele Leute tun es trotzdem. Und in vielen Fällen sind Code-Generatoren gerne explizite Dinge.

Außerdem glaube ich, in Fällen wie diese, die zusätzlichen Spezifizierer machen die Dinge ein bisschen mehr klar:

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

Auch im Beispiel '[Methode: SomeAttr] public Ereignis Aktion MyFieldLikeEvent;', die 'Methode : 'Ziel ist nicht redundant. Dies bedeutet, dass das Attribut auf beide automatisch generierten Zugriffsmethoden angewendet wird ('add' und' remove'). Der Standardwert wäre, das Attribut auf das Ereignis selbst anzuwenden. –

+0

Ich glaube, Sie meinen, Sie müssen nicht "internal" angeben, das ist der Standard-Zugriffsmodifizierer für nicht näher spezifizierte Felder usw. – nicholas