Atributo es sólo una manera de añadir información adicional (metadatos) a la clase, estructura o algún miembro. Este metadato podría ser recuperado por otro código para tomar algunas decisiones.
El ejemplo más simple es SerializableAttribute de .NET. Indica que la clase podría ser serializada por un BinaryFormatter más adelante.
Aquí es otro ejemplo - podríamos marcar algunas clases en nuestro código con ImmutableAttribute para indicar que no tienen ningún campo mutables y están bien para multihilo operaciones:
[Immutable]
public sealed class ProcessingMessage
{
//... some code that should be thread-safe
}
Luego, podría crear una prueba unitaria que encuentre todas las clases con el atributo y se asegure de que they are immutable indeed:
[Test]
public void Immutable_Types_Should_Be_Immutable()
{
var decorated = GlobalSetup.Types
.Where(t => t.Has<ImmutableAttribute>());
foreach (var type in decorated)
{
var count = type.GetAllFields().Count(f => !f.IsInitOnly && !f.IsStatic);
Assert.AreEqual(0, count, "Type {0} should be immutable", type);
}
}