为什么reflection可以在C#中访问class的protected / private成员?

为什么reflection可以在C#中访问class的protected / private成员?

这对class级来说不安全吗,为什么反思会有这样的权力? 这是反模式吗?

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

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

这是反模式吗?

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

[DataMember] private int foo; public int Foo { get {return foo;} set {foo = value;} } 

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

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

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

reflection对于调试器来说是绝对必要的。 想象一下,您正在单步执行程序,无法查看私有变量的值。 这可能就是为什么reflection在.NET和Java中工作的原因,使调试变得非常简单。

如果我们不需要调试器,那么我可以想象reflection将更多地受到OOP精神的限制。