Я думаю, что ответ на следующий вопрос предоставит вам некоторое представление о ваших вопросах.
How do attribute classes work?
Вот репост ответа я предоставил.
Атрибуты - это по существу метаданные, которые могут быть прикреплены к различным частям вашего кода. Эти метаданные могут затем быть взаимозависимыми и влиять на поведение определенных операций.
Атрибуты могут применяться практически ко всем аспектам вашего кода. Например, атрибуты могут быть связаны на уровне Ассамблеи, такие как атрибуты AssemblyVersion и AssemblyFileVersion, которые определяют номера версий, связанные с сборкой.
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
Затем Сериализуемый атрибут, например, может быть применен к декларации типа с флагом типа, как поддержка сериализации. Фактически этот атрибут имеет особое значение в CLR и фактически хранится как специальная директива непосредственно по типу в IL, он оптимизирован для хранения в виде битового флага, который может обрабатываться намного эффективнее, есть несколько атрибутов на этот характер, который известен как псевдостандартные атрибуты.
Еще другие атрибуты могут быть применены к методам, свойствам, полям, Перечисления, возвращаемые значения и т.д. Вы можете получить представление о возможных целей атрибут может быть применен к глядя на эту ссылку http://msdn.microsoft.com/en-us/library/system.attributetargets(VS.90).aspx
Далее к этому вы можете определить свои собственные пользовательские атрибуты, которые затем могут применяться к соответствующим целевым объектам, для которых предназначены ваши атрибуты. Затем во время выполнения ваш код может отражать значения, содержащиеся в пользовательских атрибутах, и предпринимать соответствующие действия.
Для довольно наивного примера, и это только ради примера :) Возможно, вы захотите написать механизм персистентности, который автоматически сопоставляет классы с таблицами в вашей базе данных и отображает свойства столбцов класса в таблицу , Вы могли бы начать с определения двух пользовательских атрибутов
TableMappingAttribute
ColumnMappingAttribute
Что вы можете применить к классам, в качестве примера мы имеем Person класс
[TableMapping("People")]
public class Person
{
[ColumnMapping("fname")]
public string FirstName {get; set;}
[ColumnMapping("lname")]
public string LastName {get; set;}
}
Когда компилируется, кроме того факта, что компилятор испускает дополнительные метаданные, определенные пользовательскими атрибутами, мало влияет на другие. Однако теперь вы можете написать PersistanceManager, который может динамически проверять атрибуты экземпляра класса Person и вставлять данные в таблицу People, сопоставляя данные в свойстве FirstName с столбцом fname и свойством LastName в столбце lname.
Что касается вашего вопроса относительно экземпляров атрибутов, экземпляр атрибута не создается для каждого экземпляра вашего класса. Все экземпляры People будут совместно использовать один и тот же экземпляр атрибутов TableMappingAttribute и ColumnMappingAttributes. Фактически экземпляры атрибутов создаются только тогда, когда вы действительно запрашиваете атрибуты в первый раз.
FYI, '[DataMember]' используется для сериализации данных: http://msdn.microsoft.com/en-us/library/system.runtime.serialization.datacontractserializer.aspx –