8 Stimmen

C#-Attribute und Metadaten-Implikation

Ich habe im Internet Tutorials über C#-Attribute und Metadaten gelesen. Es ist sehr cool, aber ich frage mich, seine Auswirkung.

  1. Werden (benutzerdefinierte) Attribute geladen, wenn die Baugruppe geladen wird, oder nur, wenn Sie Reflection zum Abrufen der Metadaten verwenden?

  2. Es scheint, dass die Attribute die Gesamtgröße des Codes erhöhen, weil sie in die ausführbare Datei kompiliert werden? Ist das richtig?

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

Ich weiß, dass man so vorgehen muss:

#if DEBUG
[MyCustomAttribute]
#endif

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

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

Gracias.

-Stephanus

6voto

Hans Passant Punkte 894572

Attribute bestehen aus zwei Teilen, ihrem Code und ihren Konstruktorargumenten und Eigenschaftsdaten. Der Code ist in der AWL der Baugruppe gespeichert, die Daten sind in den Metadaten der Baugruppe gespeichert. Wenn ein Attribut nicht verwendet wird, nimmt es nur etwas virtuellen Speicherplatz ein, beansprucht aber keine Maschinenressourcen.

Es passiert nichts, bis Sie die Methode GetCustomAttributes() verwenden. Dann wird der Code für die Attributklasse just-in-time kompiliert, genau wie der reguläre Code in Ihrer Assembly. Und der Konstruktor und die Eigenschaftssetzer werden unter Verwendung der Attributdaten in den Metadaten aufgerufen. Wenn der Speichermanager den AWL-Code, den Maschinencode und die Metadatenseiten zuordnet, wird für beides etwas RAM benötigt.

4voto

1) AFAIK Attribute sind lazy-instantiated, aber sie kommen mit der Montage 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 Reflexion, die zu den langsamsten Dingen gehört, die man im Framework tun kann. Aber ist es dann zu langsam für Ihre Anwendung? Ohne zu wissen, was Sie tun, geschweige denn, was Sie in wie vielen Millisekunden tun müssen, kann Ihnen niemand eine Antwort auf diese Frage mit Ja oder Nein geben.

Am besten ist es, einen Prototyp zu bauen und zu sehen, wie er in Wirklichkeit aussieht. Nochmals, Knuth, etc.

3voto

Reed Copsey Punkte 536986
  1. Attribute werden geladen, wenn die Baugruppe geladen wird. Sie sind Teil der Typinformationen, werden also automatisch mit den Typen geladen.
  2. Es gibt einen (sehr geringen) Preis in Bezug auf die Größe der Baugruppe mit Attributen. Allerdings ist dies sehr gering, und nicht etwas, von dem ich besorgt sein würde.
  3. Sie können dies tun, aber nur auf die Art und Weise, die Sie angeben.
  4. Das Vorhandensein von Attributen hat keine Auswirkungen auf die Leistung. Sie werden zur Laufzeit ignoriert, es sei denn, Reflection wird verwendet, um explizit nach den Attributen zu suchen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X