2012-02-06 21 views
12

Ponieważ atrybuty są tak naprawdę tylko metadanymi dołączonymi do złożeń, czy to oznacza, że ​​obiekty atrybutów są tworzone tylko na żądanie (np. Gdy wywołujesz GetCustomAttributes)?Kiedy są tworzone obiekty atrybutów?

Czy są one tworzone podczas tworzenia obiektu?

Albo kombinacja dwóch pierwszych, utworzonych podczas tworzenia obiektu z powodu skanowania atrybutów przez CLR?

+0

Dość powiązane: [.NET Atrybuty: Dlaczego GetCustomAttributes() tworzy za każdym razem nową instancję atrybutu?] (Http://stackoverflow.com/q/417275/319403). Może nawet odpowiedzieć na twoje pytanie, rozważając. – cHao

+0

Zrobiło to w pewien sposób. Właściwe pytanie nie było dla mnie problemem, ale w środku pojawiła się odpowiedź. Dobrze jest mieć pismo z książki CLR (poprzez @Smi). – Dann

Odpowiedz

8

Od CLR za pośrednictwem C#, trzecia edycja:

Jeśli chcesz zbudować obiekt atrybutu, należy zadzwonić albo GetCustomAttributes lub GetCustomAttribute. Za każdym razem, gdy wywoływana jest jedna z tych metod, konstruuje nowe instancje określonego typu atrybutu i ustawia każdy z pól i właściwości instancji na podstawie wartości określonych w kodzie źródłowym. Te metody zwracają odwołania do w pełni skonstruowanych wystąpień zastosowanych klas atrybutów.

Tak, są one tworzone tylko na żądanie.

4

Są one tworzone na zamówienie.

Na przykład, jeśli dodasz niektóre atrybuty .NET 3.0 do zestawu .NET 2.0 (np. WCF DataContractAttribute), nadal będziesz mógł używać zestawu .NET 2.0 na maszynie, która nie ma .NET 3.0 zainstalowany, pod warunkiem, że nie masz żadnego kodu, który próbuje uzyskać dostęp do atrybutów.

2

To nie jest tak czyste, atrybuty wpływają również na generowanie kodu. Niektóre atrybuty są interpretowane przez kompilator, na przykład [DllImport]. Niektóre są odkrywane przez jitter, na przykład [MethodImpl]. Jest to nieskończenie rozszerzone na inne narzędzia i klasy w ramach, które zostały napisane, aby wykorzystać atrybuty.

Ale te narzędzia robią tylko to, co musisz zrobić, jeśli chcesz znaleźć własne atrybuty, wymagane jest wywołanie funkcji GetCustomAttributes(). Ten rodzaj kodu nigdy nie jest powiązany z instancją obiektu, atrybuty dotyczą typów.

+0

Czy więc te atrybuty należące do systemu ("DllImport") pozostaną jako metadane i będą przetwarzane w ten sposób, a nie obiekt zostanie utworzony, a następnie użyty? – Dann

+1

Co właściwie robią narzędzia * z atrybutem jest wszędzie. –

Powiązane problemy