2009-08-13 5 views
10

Ich würde gerne wissen, ob die Verwendung von Attributen in. NET, speziell C#, teuer ist, und warum oder warum nicht?Ist die Verwendung von Attributen in .NET (C#) teuer?

Ich frage speziell nach C#, es sei denn, es gibt keinen Unterschied zwischen den verschiedenen. NET-Sprachen (weil die Basisklassenbibliotheken identisch sind?).

Alle neueren .Net-Technologien machen umfangreiche Verwendung von Attributen, wie Linq zu SQL, ASP.Net MVC, WCF, Enterprise Library, usw., und ich fragte mich, welchen Effekt dies auf die Leistung haben würde. Viele der Klassen werden automatisch mit bestimmten Attributen versehen, oder diese Attribute werden für bestimmte Funktionen benötigt.

Ist die Frage der Kosten von implementierungsspezifischen Details abhängig? Wie werden Attribute nach IL übersetzt? Werden sie automatisch zwischengespeichert, oder liegt das an dem Implementierer?

+3

Es gibt keinen Unterschied zwischen einer .NET-Sprache, die von der CLR ausgeführt wird. Nicht sicher, wie der DLR in das Bild passt, aber einmal kompiliert, sind C# und VB.NET (und jede andere CLR-Sprache) gleich. –

Antwort

19

"Die Verwendung von Attributen" ist zu vage. Das Abrufen der Attribute ist eine effektive Reflektionsoperation - Sie möchten dies nicht regelmäßig in einer Schleife tun - aber sie sind nicht teuer in den Metadaten und das typische Verwendungsmuster (IMO) besteht darin, eine andere Darstellung zu erstellen (z. B. ein In-Memory-Schema) nach dem einmaligen Lesen der Attribute.

Es kann durchaus etwas Caching geben, aber ich würde wahrscheinlich die andere Darstellung sowieso zwischenspeichern. Zum Beispiel, wenn ich enum Werte mit Beschreibungen dekorieren würde, würde ich im Allgemeinen die Attribute einmal holen, um eine Zeichenkette zum enum Wörterbuch (oder umgekehrt) zu bauen.

+0

Glaubst du, dass man davon ausgehen kann, dass die Attribute (oder eine Darstellung davon), die Teil der .Net BCL und anderer Microsoft Frameworks/Addons sind, zwischengespeichert werden? –

+1

Noch einmal, das ist ein bisschen vage. Wenn Sie ein sehr spezifisches Beispiel geben können und wie man feststellen könnte, ob sie zwischengespeichert sind oder nicht, wäre das eine vernünftigere Frage. –

6

Es hängt davon ab, wie Sie sie verwenden ... Einige Attribute dienen nur zur Information (ObsoleteAttribute zum Beispiel), so dass sie keinen Einfluss auf die Laufzeitleistung haben. Andere Attribute werden vom Compiler (wie DllImportAttribute) oder von Post-Compilern wie PostSharp verwendet, so dass die Kosten zur Kompilierzeit und nicht zur Laufzeit liegen. Wenn Sie jedoch zur Laufzeit Reflektionen zum Prüfen von Attributen verwenden, kann dies teuer sein.

Verwandte Themen