Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用.NET反射的私有方法。为什么?_.net_Reflection_Methods_Private - Fatal编程技术网

使用.NET反射的私有方法。为什么?

使用.NET反射的私有方法。为什么?,.net,reflection,methods,private,.net,Reflection,Methods,Private,我以前多次在公共方法上使用反射,但我从未意识到也可以调用私有方法。看 首先为什么允许这样做?这不是要打破“私人”即“私人”的规则吗?是的,它确实打破了规则。如果有人这样做,我几乎不会在审查期间传递代码 使用反射调用方法是sllllooow,而不是类型安全的,并且如果底层类重写了私有方法,则很容易中断 总之,我同意,这是个坏主意 C语言中的私有,实际上只是语言规范的一部分;在C#语言、Visual Basic语言或任何其他合理的.NET语言(包括所有.NET语言编译的内容)中,禁止访问该语言中的私

我以前多次在公共方法上使用反射,但我从未意识到也可以调用私有方法。看


首先为什么允许这样做?这不是要打破“私人”即“私人”的规则吗?

是的,它确实打破了规则。如果有人这样做,我几乎不会在审查期间传递代码

使用反射调用方法是sllllooow,而不是类型安全的,并且如果底层类重写了私有方法,则很容易中断

总之,我同意,这是个坏主意

C语言中的私有,实际上只是语言规范的一部分;在C#语言、Visual Basic语言或任何其他合理的.NET语言(包括所有.NET语言编译的内容)中,禁止访问该语言中的
私有
(或
受保护
,如果您不在派生类中)成员。然而,仅仅因为该语言不支持公开访问
private
protected
成员,并不意味着底层框架不能提供对这些成员的访问


这种情况下,通常不应该使用反射之类的变通方法来访问或修改
private
protected
成员,但框架允许这样做。一般来说,您应该有一个非常好的理由来访问
私有
受保护的
成员;例如,其中一个原因是实现一个序列化程序,该序列化程序需要查看对象的内部状态才能正确序列化对象。如果你没有做类似的事情,你应该真正考虑重新实现你在里面拨弄的类,这样你就不需要在程序中使用反射了。

这是你从框架中获得的高级功能。在生产代码中使用它来调用方法是非常少见的,它打破了成员隐藏的优点

在某些地方,它可能很有用:

  • 遗留代码测试-例如,假设您正在使用遗留代码,并且希望使用单元测试来覆盖它。如果您不允许更改代码,并且希望测试调用私有方法的一小部分功能,那么调用私有方法是很有用的
  • 生产代码中的黑客行为-我曾在第三方控制中遇到一个bug,在某些情况下,没有进行私人清理。使用私有调用,我可以解决这个问题

提供此功能的框架没有任何问题,但在非必须的地方使用它是错误的。

只有在完全信任(或具有相关权限)的情况下运行代码时才允许这样做。否则,将抛出
MethodAccessException


该框架完全能够适当地限制访问—只是当您在完全信任下运行或拥有特定权限时,它不会这样做。有关何时可以执行此操作的更多详细信息,请参阅。

反射是.NET中的一项强大功能,但也有其缺点

优点:

  • 反射允许访问所有成员(包括私有成员和受保护成员),前提是您至少具有反射权限安全性。(当应用程序从同一驱动器而不是从Internet访问反射的程序集时,可以获得此权限。)

  • 在一些罕见的情况下,反射是执行任务的唯一方法

  • 缺点:

  • 反射破坏了安全性(反编译程序集也是如此)。为了对应用程序的代码和数据获得完全的安全性,必须使用加密技术,而不仅仅依赖于私有或受保护的关键字,因为如果单独使用,很容易通过反射或反编译被破坏

  • 反射比静态引用(调用方法的正常方式)慢得多,并且消耗更多的资源。因此,你应该避免反思,除非这是解决问题的唯一方法

  • 反射是解决问题的唯一方法的示例如下:

  • 假设应用程序动态编译代码(例如,当您绘制用户在运行时提供的函数时)。在这种情况下,加载程序集和类型的唯一方法是通过反射

  • 您想克隆一个对象。您需要使用反射来访问其私有字段

  • 我希望这有帮助。
    在此,我要感谢弗朗西斯科·巴莱纳先生,他写了一本漂亮的书《为Microsoft Visual Basic 2005编程:语言》。

    链接断了。它搬到别的地方了吗?