Attribute is metadata for source code.
An attribute is created by inheriting from the System.Attribute.
To add an attribute to a code element, mark the attribute's type name in square brackets, before the code element.
For example, the following attaches the ObsoleteAttribute to the Test class:
[ObsoleteAttribute] public class Test {}
By convention, all attribute types end in the word Attribute.
C# allows you to omit the suffix when attaching an attribute:
[Obsolete]
class Test {...}
ObsoleteAttribute is a type declared in the System namespace:
C# language includes a number of predefined attributes.
Normally the target of an attribute is the code element it immediately precedes.
To attach attributes to an assembly, specify the attribute's target.
The following code uses the CLSCompliant attribute to specify CLS compliance for an entire assembly:
[assembly:CLSCompliant(true)]
Multiple attributes can be specified for a single code element.
Each attribute can be listed
The following three examples are semantically identical:
[Serializable, Obsolete, CLSCompliant(false)] public class Test {...} [Serializable] [Obsolete] [CLSCompliant(false)] public class Test {...} [Serializable, Obsolete] [CLSCompliant(false)] public class Test {...}
Attributes may have parameters.
Suppose we have the following code which applies XmlElementAttribute to a class.
[XmlElement ("Customer", Namespace="http://oreilly.com")] public class CustomerEntity { ... }
Attribute parameters have two categories: positional or named.
In the code above the first argument is a positional parameter; The second is a named parameter.
Positional parameters correspond to parameters of the attribute type's public constructors.
Named parameters correspond to public fields or public properties on the attribute type.