为什么反射可以在C#中访问类的受保护/私有成员?

Ben*_*nny 18 c# reflection

为什么反射可以在C#中访问类的受保护/私有成员?

这对于全班来说是不安全的,为什么反思会给予这种力量?这是反模式吗?

Tam*_*ege 22

成员辅助功能不是安全功能.它是为了保护程序员免受他或她自己的伤害.它有助于实现封装,但它绝不是安全功能.

反思是冗长乏味的,因此人们通常不会自愿使用它来访问非公共成员.它也很慢.反射通常仅用于特殊情况.然而,没有什么可以完全保护人类的愚蠢,如果有人想滥用反思,他可以很容易地做到,但即使没有反射API,他们也可以实现同样的事情(如果他们完全信任,那就是)如果他们足够坚定了.

  • "成员辅助功能不是安全功能"的+1. (3认同)

Mar*_*ell 19

这对于远程处理,序列化,物化等场景是必要的.您不应盲目使用它,但请注意,这些设施始终可用于任何系统(实际上,通过直接寻址内存).反思简单地将其形式化,并将控制和检查放在路上 - 您没有看到它,因为您可能正在以"完全信任"运行,因此您已经比受保护的系统更强大.

如果您在部分信任中尝试此操作,您将看到对内部状态的更多控制.

这是反模式吗?

仅当您的代码使用不当时.例如,请考虑以下内容(对WCF数据协定有效):

[DataMember]
private int foo;

public int Foo { get {return foo;} set {foo = value;} }
Run Code Online (Sandbox Code Playgroud)

WCF支持这个是不正确的吗?我怀疑没有...有多种情况下你想要序列化不属于公共API的东西,而没有单独的DTO.同样,如果您选择,LINQ-to-SQL将实现为私有成员.