C # Attribute und Metadaten Implikation

8

Ich habe Tutorials aus dem Internet über C # -Attribute und Metadaten gelesen. Es ist sehr cool, aber ich frage mich, was es bedeutet.

  1. Werden (benutzerdefinierte) Attribute geladen, wenn die Assembly geladen wird? oder ist es nur, wenn Sie Reflektion verwenden, um die Metadaten abzurufen?

  2. Es scheint, dass die Attribute zur Gesamtgröße des Codes beitragen, weil es in die ausführbare Datei kompiliert wird? Ist das richtig?

  3. Ist es möglich, Kompilierzeitattribute zu haben? I.e. Attribute werden nur angewendet, wenn DEBUG definiert ist?

Ich weiß, dass man so etwas tun soll:

%Vor%

Aber ich frage mich, ob es einen besseren Weg gibt?

  1. Gibt es bei der Verwendung vieler Attribute irgendwelche Leistungs- / Speichereinschränkungen? Meine Zielplattform wird Xbox 360 sein (mit C # / XNA).

Danke!

-Stephanus

    
tep 24.03.2010, 15:57
quelle

3 Antworten

6

Es gibt zwei Teile für Attribute, ihren Code und ihr Konstruktorargument und ihre Eigenschaftsdaten. Der Code wird in der AWL der Baugruppe gespeichert, die Daten werden in den Baugruppenmetadaten gespeichert. Wenn ein Attribut nicht verwendet wird, benötigt es nur wenig virtuellen Speicherplatz, benötigt jedoch keine Maschinenressourcen.

Nichts passiert, bis Sie die GetCustomAttributes () -Methode verwenden. Dann wird der Code für die Attributklasse genau wie der reguläre Code in Ihrer Assembly just-in-time kompiliert. Und der Konstruktor und die Eigenschaften-Setter werden unter Verwendung der Attributdaten in den Metadaten aufgerufen. Sie benötigen etwas RAM für beide, wenn der Speichermanager die IL, den Maschinencode und die Metadatenseiten abbildet.

    
Hans Passant 24.03.2010, 16:26
quelle
4

1) AFAIK-Attribute werden instanziiert, aber sie kommen mit der Assembly in den Speicher.
2) Nicht annähernd genug um sich Sorgen zu machen. Knuth, etc.
3) Ja.

Die Verwendung von Attributen bedeutet die Verwendung von Reflektion, die zu den langsamsten Dingen zählt, die Sie im Framework ausführen können. Aber ist es dann zu langsam für Ihre Anwendung? Ohne zu wissen, was Sie tun, geschweige denn was Sie innerhalb von wie vielen Millisekunden tun müssen, kann Ihnen niemand eine Ja oder Nein Antwort geben.

Am besten ist es, einen Prototyp aufzureißen und zu sehen, wie es mit IRL aussieht. Wieder Knuth, usw.

    
Will 24.03.2010 16:04
quelle
3
  1. Attribute werden geladen, wenn die Assembly geladen wird. Sie sind Teil der Typinformation, also werden die Typen automatisch geladen.
  2. Es gibt (sehr kleine) Kosten in Bezug auf die Größe der Baugruppe mit Attributen. Das ist jedoch sehr unbedeutend und nicht etwas, worüber ich besorgt wäre.
  3. Sie können das tun, aber nur so, wie Sie es zeigen.
  4. Es gibt keine Auswirkungen auf die Leistung von Attributen. Sie werden zur Laufzeit ignoriert, es sei denn, Reflektion wird verwendet, um explizit nach den Attributen zu suchen.
Reed Copsey 24.03.2010 16:06
quelle