Mutation Person
Mutation Person

Reputation: 30498

C# Attributes and attribute location/targets

I'm reading up about attributes and understand that they can be made to apply to different target entities with you code - (see Attribute Targets).

So, looking at the AssemblyInfo.cs file in my project, I can see the following:

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

Which makes sense to me. An attribute whose target is the assembly.

In my code I can add an attribute on a class as follows:

[MyAttribute]
class MySerialzableClass
{

With MyAttribute being:

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

So, I got to thinking about the assembly: statement in the first code block. And tried this, just for experimentation:

[class: MyAttribute]
class MySerialzableClass
{

This gives the compiler warning:

'class' is not a recognized attribute location. All attributes in this block will be ignored.

So my question is this - Why do have to specify the Attribute Target on some attributes and are not requried, or permitted to for others? Moreover, for which ones must you do this?

Upvotes: 6

Views: 3246

Answers (3)

Jordão
Jordão

Reputation: 56467

You can specify attribute targets for any attribute usage, but only the ones that don't have a default (assembly and module) are mandatory. Also, you must use these annotations when you want to apply an attribute to a non-default target.

Examples of non-default targets:

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

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

In your example, the right target (which is the default) is type:

[type: MyAttribute] 
class MySerialzableClass { }

Upvotes: 5

Andrey
Andrey

Reputation: 60065

you have to specify target explicitly in case where the target is not represented in code. I know only three that targets, assembly, module and return:

[return: MyAttribute]
public static int meth(

for class specifying class: is excessive, compiler can understand what do you meant

Upvotes: 5

Steven Sudit
Steven Sudit

Reputation: 19620

Normally, the attribute comes right before what it affects, such as the class or method. For assembly-wide attributes, there's no "before", so you have to specify.

Upvotes: 3

Related Questions