Attributes
[[target:]? attribute-name ( positional-param+ | [named-param = expr]+ | positional-param+, [named-param = expr]+)?]
Attributes are language constructs that can decorate a code element (assemblies, modules, types, members, return values, and parameters) with additional information.
In every language, you specify information associated with the types,
methods, parameters, and other elements of your program. For example, a type
can specify a list of interfaces it derives from, or a parameter can specify
modifiers, such as the ref modifier in C#. The limitation
of this approach is you can associate information with code elements
using only the predefined constructs that the language provides.
Attributes allow programmers to extend the types of information associated with these code elements. For example, serialization in the .NET Framework uses various serialization attributes applied to types and fields to define how these code elements are serialized. This approach is more flexible than requiring the language to have special syntax for serialization.
Attribute Classes
An attribute is defined by a class that inherits (directly or indirectly)
from the abstract class System.Attribute. When specifying
an attribute to an element, the attribute name is the name of the type. By
convention, the derived type name ends in Attribute, although
specifying the suffix is not required when specifying the attribute.
In this example, the Foo class is specified as serializable
using the Serializable ...