2

有人建议我不要使用反射。我真的很想知道,是因为反射很贵吗?如果不是,那么避免使用它的原因是什么?

我当前和未来的项目可能还需要访问任何给定的类成员信息。因为我有时需要列出字段和属性 - 值或声明名称。

所以我想知道的是:

反射是如何工作的?它是如何获取信息的?(一个简短的解释就可以了)

为什么不建议在应用程序中使用反射?如果您确实需要获取作为字段或属性值或名称的所需信息,您可以使用 System.Reflection 来完成吗?

一些背景。

我当前项目中的用法(例如)是列出特定的 sql server 表列名称或 SQL 表名称。

我可以想出其他方法让它返回为List<strings>.

如果我真的知道它为什么或有多“糟糕”,使用reflection

..如果我真的想避免它,我可以做出决定,因为我可能会找到一种替代方法(在这种特定情况下)。

通过在我需要(例如)表名列表的任何时候访问数据库(不优选),或者我可以执行一次(访问数据),然后将其存储在文本文件或 xml 中,如果我真的必须避免反射的话。

我也知道一些更优雅的。但这不是问题。(这只是一个示例,因为可能还有许多其他用例,您可能知道。)

更新

此问题已关闭,请帮助重新打开它,并在下面投票“重新打开”

谢谢 。

4

3 回答 3

9

CLR 程序集(可执行或动态链接库)通常包含有关其结构的元数据,这意味着有关类型、结构、方法、字段、它们的名称的信息以及一堆其他信息,这些信息在“传统”语言中是通常仅由偏移量和大小信息丢失和替换。

反射是一个强大的工具,一些(通常是高级的)事情只能使用反射来实现。但是,它也引起了对安全性和封装的担忧,因为您开始依赖程序(或其他程序)的各个部分的实现,而您通常应该避免这些并只信任这些部分提供的接口。另一个问题是性能,因为要访问所有这类(最终是文本)信息,程序会变慢,与使用非反射方法(通常仍使用偏移量和大小信息)相比。例如,您可以使用反射重新实现多态性并绕过虚拟方法表。但后者比前者快很多倍。

必要时使用反射,但非必要时不要使用。它是非常强大的工具之一,人们建议不要使用它们,但如果你真的知道你在做什么,你可以使用它们。话虽如此,请记住,以错误的方式使用反射技术不仅会引发上述问题,而且还会使您的代码更难维护。

于 2012-12-12T19:25:39.127 回答
2

如果它像“从不使用反射”那么简单,我们根本就没有反射。

反射慢,因此,您必须谨慎使用它。通常有更好的解决方案(在设计和性能方面)使用接口、委托等来实现您的目标(想到依赖注入和动态类型)。

尝试弄清楚如何使用面向对象的设计来解决您的问题而无需反思。如果您确实需要使用反射,请考虑其性能将如何影响您的应用程序,并进行相应的设计。

于 2012-12-12T19:21:32.603 回答
0

反射通过解析类类型信息来工作。谨慎使用它,因为它的计算成本很高。

于 2012-12-12T19:22:45.827 回答