This is the base class for all custom attributes. Attributes are the .NET
programmer’s means of inserting additional metadata into a type’s
definition. For example, the .NET Serialization mechanism uses an attribute
to indicate which fields in a type should not be serialized (see the
enumeration value). .NET programmers are free
to create their own attributes (called custom attributes, although from a
certain perspective all attributes are inherently custom) by creating a
new type that claims
Attribute as its base
By themselves, attributes offer no modification to a type’s behavioral
semantics; that is, attributes don’t modify the type’s methods or
execution in any way. In fact, attribute instances aren’t even created
until they are retrieved out of the type’s metadata via the Reflection APIs. The
entire purpose of an attribute is to act as a marker inside the type’s
metadata for consumption by some other API, library, or facility.
For example, the Serialization APIs in the .NET Framework Class Library use
Serializable attribute to indicate which types are serializable.
However, by themselves, the attributes carry no code to perform the actual
act of serialization. This must be done by passing the instance of the
type into instances of the Serialization classes, in which the attribute
is retrieved, examined, and “appropriate” action is taken.
Attributes can be attached to any metadata component ...