我在研究反射,我了解了一些,但我并没有了解与这个概念相关的所有内容。为什么我们需要反射(reflection)?哪些我们无法实现但需要反射(reflection)的事情?
最佳答案
反射支持的场景有很多,但我主要将它们分为两类。
- 反射使我们能够编写分析其他代码的代码。
例如,考虑有关程序集的最基本问题:其中有哪些类型?程序集是自描述的,反射是将该描述呈现给其他代码的机制。
例如,假设您想编写一个程序,该程序采用一个程序集并以图形方式显示该程序集中各个类之间的关系,以帮助您理解该代码。有这样的工具。他们在 Visual Studio 中。 有人编写了这些工具。它们不是靠魔法出现的。反射是 .NET 框架中设计的一种机制,它使您或我或任何其他人能够编写能够理解代码的工具。
- 反射使我们能够将编译时绑定(bind)移动到运行时。
假设您有一个静态方法Foo.Bar()
。当您在程序中调用 Foo.Bar()
时,您可以 100% 确定您认为将要调用的方法实际上将被调用。我们将静态方法称为“静态”,因为可以静态地 理解从名称 Bar 到被调用代码的绑定(bind)——也就是说,无需运行程序。
现在考虑基类上的虚方法Blah()
。当您调用 whatever.Blah()
时,您并不知道在编译时将调用哪个 Blah()
,但您知道一些 没有参数的方法 Blah()
将在 some 类型上调用,该类型是 whatever
的运行时类型,并且该类型等于或派生自声明 Blah()
的类型。 (事实上你知道的更多:你知道它等于或派生自 whatever
的编译时类型。)虚拟绑定(bind)是动态绑定(bind)的一种形式,但它不是完全 动态。用户无法决定此调用应该针对不同类型层次结构上的不同方法。
反射使我们能够在运行时进行完全绑定(bind)的调用,如果我们愿意,完全基于用户的选择。我们付出了性能代价,并且失去了编译时类型安全性,但我们获得了灵 active ,可以在运行时 100% 决定调用什么代码。在某些情况下,这是一个合理的权衡。
关于c# - 为什么我们需要反射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50224794/