2013-03-27 29 views
7

C# belirtiminde (17.2), bir öznitelik belirtilirken çok sayıda özellik hedefi olduğunu belirtir. Bu, bir özelliği belirtmek için genellikle "gerçek" bir yere sahip olmayan bir şeye bir özellik uygulamanız gerektiğinde yaygındır. Örneğin, return hedef platform Invoke genellikle kullanılır:Yöntem nitelik hedefinin amacı nedir?

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

hangi koşullarda açıkça tanımlamak gerekir:

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

Ben method gibi diğer nitelik hedefleri olduğunu fark Ancak method öznitelik hedefi (muğlaklığı çözmek için mi söylüyorsunuz), yoksa tamlık için mi?

cevap

7

Bu durumda hedefi belirtmeniz gerekmez (doğrudan bir yöntemin üstünde bulunur, method varsayılan hedeftir), yalnızca tamlık için oradadır. Tıpkı bir sınıfa üye eklerken private belirtmeniz gerekmediği gibi, yine de birçok kişi bunu yapar. Ve çoğu durumda kod jeneratörler şeyler hakkında fazladan açık olmak ister.

Ayrıca ben böyle durumlarda düşünmek, ek belirteci biraz daha net şeyler yapar: Ayrıca

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

, örneğin '[yöntem: SomeAttr] kamu Etkinlik İşlem MyFieldLikeEvent;', 'yöntemi : 'hedef gereksiz değildir. Bu, özniteliğin hem otomatik olarak oluşturulan erişim sağlayıcılarına ("ekle" ve "kaldır") uygulanacağı anlamına gelir. Varsayılan, özniteliğin kendisinin kendisine uygulanması olacaktır. –

+0

Anlamsız alanlar, vb. Için varsayılan erişim değiştirici olan 'internal 'belirtmenize gerek olmadığı anlamına gelir. – nicholas