如果您可以通过反射访问它们,那么拥有私有构造函数有啥意义?
Posted
技术标签:
【中文标题】如果您可以通过反射访问它们,那么拥有私有构造函数有啥意义?【英文标题】:What's the point of having private constructors if you can access them with reflection?如果您可以通过反射访问它们,那么拥有私有构造函数有什么意义? 【发布时间】:2011-05-10 00:45:44 【问题描述】:可能还有私有静态方法和属性等
【问题讨论】:
【参考方案1】:访问修饰符有助于指导程序流程。它们就像交通信号灯——你不必服从它们,在某些情况下,授权玩家可能会选择忽略它们,但你通常希望尊重它们,因为它们让一切运行得更加顺畅。
【讨论】:
【参考方案2】:私有构造函数通常与设计模式(例如Factory Method Pattern、Singleton Pattern)一起使用,以防止对象被错误地实例化。
如果您不需要访问任何实例变量(编译器不必检查对象是否为非空),私有静态方法通常调用速度更快。
【讨论】:
【参考方案3】:反射被认为是一种比通常更强大的访问类的方法 - 建议对不受控制的代码拒绝非公共访问 - 请参阅 ReflectionPermission。
没有 ReflectionPermission,代码可以 使用反射仅访问 对象的公共成员。代码与 ReflectionPermission 和 适当的 ReflectionPermissionFlag 标志可以访问受保护和 对象的私有成员。
注意
因为反射权限 可以提供对非公共类型的访问 和会员,我们建议您这样做 不授予 ReflectionPermission 给 互联网代码,除了 ReflectionPermissionFlag.RestrictedMemberAccess 旗帜。 RestrictedMemberAccess 允许 访问非公共成员,与 的授予集的限制 非公共成员必须等于, 或其子集的授权集 访问非公开的代码 成员。
换句话说,人们只有在你允许的情况下才能访问你的类内部 - 就像首先设置访问修饰符一样,对于具有程序集引用的直接客户端。任何成员只有在您让其可见时才可见。
【讨论】:
【参考方案4】:此行为在 Silverlight 运行时中有所不同,基本上反射只能执行编译器(C# 或 VB)允许执行的操作。 因此,在 Silverlight 中,您不能使用私有构造函数进行实例化,即使使用 Activator.CreateInstance。
【讨论】:
以上是关于如果您可以通过反射访问它们,那么拥有私有构造函数有啥意义?的主要内容,如果未能解决你的问题,请参考以下文章