2010-03-24 19 views
8

Przeczytałem samouczki z sieci o atrybutach i metadanych C#. Jest bardzo fajny, ale zastanawiam się nad jego implikacją.Atrybuty C# i metadane

  1. Czy atrybuty (niestandardowe) zostały załadowane po załadowaniu zespołu? czy to tylko wtedy, gdy używasz odbicia, aby odzyskać metadane?

  2. Wygląda na to, że atrybuty dodają się do całkowitego rozmiaru kodu, ponieważ zostanie on wkompilowany do pliku wykonywalnego? Czy to jest poprawne?

  3. Czy możliwe jest posiadanie atrybutów czasu kompilacji? To znaczy. atrybuty zostaną zastosowane tylko, jeśli zdefiniowano DEBUG?

wiem jedno jest zrobić tak:

#if DEBUG 
[MyCustomAttribute] 
#endif 

Ale zastanawiam się, czy istnieje lepszy sposób?

  1. Czy występuje jakieś zastrzeżenie wydajności/pamięci podczas korzystania z wielu atrybutów? Moją platformą docelową będzie konsola Xbox 360 (przy użyciu C#/XNA).

Dzięki!

-Stephanus

Odpowiedz

6

Istnieją dwie części atrybutów, ich kod oraz ich argument konstruktora i dane właściwości. Kod jest przechowywany w IL zespołu, dane są przechowywane w metadanych zestawu. Jeśli atrybut nie jest używany, zajmuje to tylko część pamięci wirtualnej, ale nie wymaga żadnych zasobów komputera.

Nic się nie dzieje, dopóki nie zostanie użyta metoda GetCustomAttributes(). Następnie kod klasy atrybutowej jest kompilowany tak, jak zwykły kod w zespole. Konstruktor i selektory właściwości są wywoływane przy użyciu danych atrybutów w metadanych.Zużyjesz trochę RAM dla obu, gdy menedżer pamięci odwzoruje IL, kod maszynowy i strony metadanych.

4

1) Cechy afaik są lazy wystąpienia, lecz pochodzą z montażu w pamięci.
2) Nie na tyle blisko, aby się martwić. Knuth, itp.
3) Tak.

Używanie atrybutów oznacza używanie refleksji, która zalicza się do najwolniejszych rzeczy, które możesz zrobić w ramach. Ale czy jest to zbyt wolne dla twojej aplikacji? Nie wiedząc, co robisz, nie mówiąc już o tym, co musisz zrobić w ciągu milisekund, nikt nie może ci odpowiedzieć tak lub nie.

Najlepiej wyhaftować prototyp i sprawdzić, jak wygląda jego IRL. Ponownie, Knuth itp.

3
  1. Atrybuty są ładowane po załadowaniu zestawu. Są one częścią informacji o typie, więc są ładowane z typami automatycznie.
  2. Istnieje (bardzo mały) koszt pod względem wielkości zespołu z atrybutami. Jest to jednak bardzo drobne, a nie coś, co mnie interesuje.
  3. Możesz to zrobić, ale tylko w taki sposób, jaki pokazujesz.
  4. Nie ma wpływu na wydajność posiadania atrybutów. Są one ignorowane w środowisku wykonawczym, chyba że zastosowano odbicie, aby jawnie wyszukiwać atrybuty.