Ich habe festgestellt, dass ich beim Umgang mit Ausdrücken oder Ausdrucksbäumen viel Reflexion verwende, um Werte in Eigenschaften festzulegen und abzurufen, und was Sie haben. Mir ist aufgefallen, dass die Verwendung von Reflexion immer häufiger zu werden scheint. Dinge wie DataAnotations zur Validierung, Attribute Heavy ORMs usw. Haben Sie sich gefragt: Was hat sich seit den Tagen und Jahren geändert, als mir gesagt wurde, dass ich Reflexionen möglichst vermeiden soll?
Was ist, wenn sich etwas geändert hat? Ist es nur die Geschwindigkeit der Maschinen? Wurden Änderungen am Framework vorgenommen, um die Reflexion zu beschleunigen?
Oder hat sich nichts wirklich geändert? Ist es immer noch "schlecht" oder "langsam", Reflexion zu verwenden?
.net
reflection
Fleisch
quelle
quelle
Antworten:
Reflexion ist weder schlecht noch langsam. Es ist einfach ein Werkzeug. Wie alle Tools ist es für bestimmte Szenarien sehr wertvoll, für andere weniger.
Wenn Leistung wirklich ein Problem ist, können Sie immer eine Bibliothek wie FasterFlect verwenden .
Weitere Informationen
Wenn die Reflexion ineffizient ist, wann ist sie am besten geeignet?
quelle
dynamic
- anscheinend eine Größenordnung schneller als Reflexion.Der Grund, warum die Leute nicht unnötig auf Reflexion achten, ist nicht die Leistung: Ja, die Verwendung von Reflexion ist mit einem gewissen Aufwand verbunden, aber häufig erfordert die Lösung des Problems ohne Reflexion einen anderen Ansatz mit vergleichbarer Komplexität, und selbst wenn dies nicht der Fall ist, ist dies der Aufwand selten von Bedeutung (insbesondere für die Entwicklung auf Anwendungsebene).
Bei der Verwendung von Reflection sind einige wichtige Annahmen, die man normalerweise zum Quellcode machen kann, fehlerhaft, und Tools wie "Alle Verweise suchen" funktionieren nicht mehr zuverlässig. Reflection beseitigt im Grunde genommen auch den größten Teil der Typensicherheit, die der Compiler beispielsweise in C # erzwingt, und die meisten Programmierfehler, die ein Typensystem normalerweise abfängt und in Compilerfehler umsetzt, werden im besten Fall zu Laufzeitfehlern oder im schlimmsten Fall zu sehr undurchsichtigen Fehlern.
Warum verwenden die Leute dann Reflexion? Einfach ausgedrückt, weil es trotz der oben beschriebenen Probleme ein sehr wertvolles Werkzeug ist. Mit Reflektion können einige der Vorteile der dynamischen Programmierung in einer statischen, streng typisierten Sprache wie C # erzielt werden, und dynamische Programmiersprachen haben in letzter Zeit ihre Vorzüge gezeigt, insbesondere im Bereich der Webprogrammierung - PHP, Javascript und ganz prominent Python verwenden alle dynamische Typisierung und haben sich als gut für die Webprogrammierung erwiesen. Da die Sprache jedoch immer noch C # ist, können Sie den größten Teil Ihrer Anwendung in einer streng typisierten OOP-Sprache speichern und den kleinen Teil schreiben, in dem dynamisches Verhalten bei der Reflexion wirklich einen Unterschied macht.
Ein typisches Beispiel ist, wenn Sie Methoden als Webdienstaufrufe verfügbar machen müssen (unter Verwendung eines Protokolls, das noch nicht in .NET integriert ist). Der streng typisierte OOP-Ansatz funktioniert zwar, ist jedoch zu restriktiv und umständlich. Wenn Sie jedoch Reflection verwenden, um Aufrufe von Methoden und Schlüssel / Wert-Paare Argumenten zuzuordnen, können Sie das Installationsprogramm für einen solchen Webdienst einmal schreiben und es dann für eine beliebige Klasse verwenden.
quelle
Die Reflexion ist immer noch deutlich langsamer als bei direkten Anrufen. Zwei Dinge haben sich geändert:
Zusammen haben diese beiden Faktoren die Reflektionskosten auf einen Punkt gesenkt, an dem Sie sie routinemäßig verwenden können (gegebenenfalls anhand eines Wartbarkeits-POV) und warten, bis der Profiler Ihnen mitteilt, ob es sich tatsächlich um einen Engpass handelt (und Sie sind sich einigermaßen sicher, dass die meisten Probleme auftreten) die Zeit wird es nicht sein).
quelle