Powodem, dla którego ludzie obawiają się niepotrzebnego korzystania z odbicia, nie jest wydajność: tak, korzystanie z odbicia wiąże się z pewnym nakładem pracy, ale często rozwiązanie problemu bez niego wymaga innego podejścia o porównywalnej złożoności, a nawet jeśli nie, koszty ogólne są rzadko znaczące (szczególnie dla rozwoju na poziomie aplikacji).
Korzystając z refleksji, niektóre ważne założenia dotyczące kodu źródłowego, które normalnie można przyjąć, są łamane, a narzędzia takie jak „Znajdź wszystkie referencje” przestają działać niezawodnie. Refleksja zasadniczo usuwa również większość typów bezpieczeństwa, jakie wymusza kompilator, powiedzmy w C #, a większość błędów programistycznych, które system typów wychwytuje i tłumaczy na błędy kompilatora, teraz stają się w najlepszym razie błędami czasu wykonywania lub w najgorszym razie bardzo niejasnymi błędami.
Dlaczego więc ludzie używają refleksji? Mówiąc wprost, ponieważ pomimo opisanych wyżej problemów jest to bardzo cenne narzędzie. Po zastanowieniu, niektóre zalety programowania dynamicznego można uzyskać w statycznym, ściśle typowym języku, takim jak C #, a dynamiczne języki programowania niedawno pokazały swoje zalety, szczególnie w dziedzinie programowania internetowego - PHP, JavaScript i dość wyraźnie Python , wszystkie używają dynamicznego pisania i okazały się dobre do programowania w sieci. Ale ponieważ językiem wciąż jest C #, możesz zdecydować się na zachowanie większości aplikacji w ściśle typowym idiomie OOP i napisać małą część, w której dynamiczne zachowanie naprawdę robi różnicę dzięki refleksji.
Typowym przykładem jest konieczność ujawnienia metod jako wywołań usługi internetowej (przy użyciu protokołu jeszcze nie wbudowanego w .NET). Podejście OOP ściśle wpisane działa, ale jest zbyt restrykcyjne i niezdarne. Ale jeśli użyjesz refleksji do odwzorowania wywołań metod i par klucz / wartość na argumenty, możesz raz napisać hydraulikę takiej usługi sieci, a następnie użyć jej w dowolnej klasie, którą lubisz.