¿Por qué el reflection puede acceder al miembro protegido / privado de la clase en C #?

¿Por qué el reflection puede acceder al miembro protegido / privado de la clase en C #?

¿Esto no es seguro para la clase, por qué la reflexión recibe tal poder? ¿Es esto un antipatrón ?

Esto es necesario para escenarios como la comunicación remota, la serialización, la materialización, etc. No debe usarlo a ciegas, pero tenga en cuenta que estas instalaciones siempre han estado disponibles en cualquier sistema (esencialmente, al direccionar la memoria directamente). La reflexión simplemente lo formaliza y coloca controles y controles en el camino, que no está viendo porque presumiblemente se ejecuta con “plena confianza”, por lo que ya es más fuerte que el sistema que se está protegiendo.

Si prueba esto en confianza parcial, verá mucho más control sobre el estado interno.

¿Es un antipatrón?

Solo si su código lo usa de manera inapropiada. Por ejemplo, considere lo siguiente (válido para un contrato de datos WCF):

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

¿Es incorrecto que WCF lo apoye? Sospecho que no … hay múltiples escenarios en los que desea serializar algo que no es parte de la API pública, sin tener una DTO separada. Del mismo modo, LINQ-to-SQL se materializará en miembros privados si así lo eliges.

La accesibilidad de los miembros no es una característica de seguridad. Está ahí para proteger al progtwigdor contra sí mismo. Ayuda a implementar la encapsulación, pero de ninguna manera es una característica de seguridad.

La reflexión es lo suficientemente tediosa como para que la gente normalmente no se desvive por utilizarla para acceder a los miembros no públicos. También es bastante lento. La reflexión normalmente se usa solo en casos especiales. Sin embargo, nada puede proteger completamente contra la estupidez humana, si alguien quiere abusar de la reflexión puede hacerlo fácilmente, pero incluso sin la API de reflexión, pueden lograr lo mismo (si se ejecutan con plena confianza, eso es) si están lo suficientemente determinados

Debido a que está especificado en la especificación ECMA, 9 Metadatos .

La reflexión es absolutamente necesaria para un depurador. Imagine que está avanzando en su progtwig y no puede ver los valores de sus variables privadas. Esa es probablemente la razón por la cual la reflexión funciona en .NET y Java de la manera en que funciona, para que la depuración sea realmente fácil.

Si no necesitamos depuradores, entonces puedo imaginar que la reflexión estaría restringida más en el espíritu de OOP .