Есть еще одна причина запечатать атрибуты.
Рассмотрим следующий атрибут:
[AttributeUsageAttribute(AttributeTargets.Class, AllowMultiple = false)]
public class Attr1 : Attribute
{
}
Здесь вы разрешаете только оформление одного атрибута: AllowMultiple = false
Компилятор не разрешит это:
[Attr1]
[Attr1]
public class Foo
{
}
Позже в вашем коде вы можете безопасно вызывать memberInfo.GetCustomAttribute()
, который выдаст AmbiguousMatchException
, если будет найдено более одного атрибута данного типа.
Давайте теперь унаследуем:
public class Attr2 : Attr1
{
}
Теперь компилятор молчит.
[Attr1]
[Attr2]
public class Foo
{
}
Так что если позже кто-то унаследует ваш атрибут и вернет его в ваш код, то будет сгенерирована сущность, отмеченная обоими атрибутами.Полный пример:
class Program
{
static void Main(params string[] args)
{
typeof(Foo).GetCustomAttribute<Attr1>();
}
[AttributeUsageAttribute(AttributeTargets.Class, AllowMultiple = false, Inherited = true)]
public class Attr1 : Attribute
{
}
public class Attr2 : Attr1
{
}
[Attr1]
[Attr2]
public class Foo
{
}
[Attr1]
public class Bar : Foo
{
}
}