Как показывает ваш пример, атрибуты действительно необходимы в нескольких ключевых областях программирования .NET.
Атрибуты предоставляют модель, известную как «Аспектно-ориентированное программирование» или AOP. Вместо того чтобы писать код, выполняющий какую-то конкретную задачу, такую как сериализация, взаимодействие с DLL, ведение журнала и т. Д., Вы можете просто декорировать классы или члены, для которых вы хотите, чтобы эти задачи выполнялись с помощью атрибута. Атрибуты - это особый тип класса, члены которого могут вызываться CLR при выполнении кода, который будет выполнять ту задачу, которую вы хотели при оформлении кода.
Вы правы частично; многие атрибуты предназначены просто для хранения метаданных. Описание Атрибут хороший. Однако даже в этом случае атрибут важен в зависимости от того, как он используется. Если вы украшаете член класса GUI, который хотите использовать в конструкторе, [Description ()] предоставляет ценную информацию пользователю класса в конструкторе, которым может быть не вы. Я также видел и использовал много альтернативных вариантов использования DescriptionAttribute; его можно применять практически ко всему, поэтому я использовал его для предоставления «дружественных имен» для констант Enum в сочетании с методом расширения GetDescription () для их получения при использовании Enums для заполнения раскрывающихся списков.
Итак, хотя это технически «метаданные», атрибут «требуется» определяется тем, насколько вы хотите, чтобы выполнялась задача, присущая этому атрибуту.