Согласно книге я читаю, AllowMultiple
общественная собственность AttributeUsage
указывает:
... может ли цель иметь несколько экземпляров атрибута, относился к нему.
Почему был бы я хотеть/не хотеть использовать это?
Атрибуты - это мета-данные. Обычно, вы захотите украсить члена или напечатать атрибут, чтобы отследить некоторую информацию о нем.
Например, в PropertyGrid для обозначения описания свойства используется ОписаниеАтрибут:
[Description("This is my property")]
public int MyProperty { get; set; }
В большинстве случаев, иметь более одного описания не имеет смысла.
Однако, возможно, что конкретный атрибут имеет смысл использовать более одного раза. В таком случае, вы захотите установить атрибут, чтобы позволить нескольким экземплярам себя пометить один и тот же атрибут.
(Не то чтобы я бы сделал это, но...) Скажем, вы сделали пользовательский атрибут, чтобы отслеживать основные изменения в классе. Вы можете захотеть перечислить это для каждого основного изменения:
[Changes(Version=1.1, Change="Added Foo Feature")]
[Changes(Version=2.0, Change="Added Bar Feature")]
public class MyClass
{
// ...
Этот пример может быть немного надуманным, но, надеюсь, он перейдет всю суть.
[Convertable(typeof(Int32)), Convertable(typeof(Double))]
public class Test
{
}
Это зависит от того, что представляют собой атрибуты.
Например, можно сделать атрибут, который помечает класс как зависящий от чего-то, и можно разрешить множественные зависимости.
Для конкретного примера посмотрите на SuppressMessage
, который подавляет предупреждение анализа кода. Член может иметь несколько предупреждений, которые вы можете захотеть подавить.
Другой пример - WebResource
; ассемблера может содержать несколько ресурсов.
Здесь нет надуманного примера, я использовал его в реальном производственном коде. Я написал код для разбора файла, содержащего пары данных типа (code=value). Я поместил на функцию пользовательский атрибут, чтобы указать, что он должен вызываться для данного кода.
[CanParseCode("G1")]
[CanParseCode("G2")]
private void ParseGXCodes(string code, string value)
{
...
}
Этот специфический формат немного старый и специфичный для данной области с сотнями различных кодов. Моей целью было написать фреймворк, чтобы облегчить написание файловых процессоров, которые могли бы извлекать только нужные ей коды, а остальное игнорировать. Разрешение одного и того же атрибута несколько раз упростило выражение намерения кода, просто объявив атрибуты на функции, обрабатывающие каждый код.
.