Атрибут это просто способ добавить дополнительную информацию (метаданные) в классе, структуре или какой-то член. Эти метаданные могут быть получены другим кодом для принятия некоторых решений.
Простейший пример - SerializableAttribute от .NET. Это указывает на то, что впоследствии класс может быть сериализован BinaryFormatter.
Вот другой пример - мы могли бы отметить некоторые классы в нашем коде с ImmutableAttribute, чтобы указать, что они не имеют никаких изменяемых полей и OK для многопоточных операций:
[Immutable]
public sealed class ProcessingMessage
{
//... some code that should be thread-safe
}
Тогда мы может создать единичный тест, который найдет все классы с атрибутом и гарантирует, что 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);
}
}