c# - programacion - que es un atributo en poo
¿Por qué es posible cambiar un miembro privado o ejecutar un método privado en C#utilizando la reflexión? (9)
Esta pregunta ya tiene una respuesta aquí:
Hace poco me encontré con un problema que tenía al usar C #, y se resolvió estableciendo un miembro privado usando reflection .
Me sorprendió descubrir que establecer un miembro / campo privado y también ejecutar un método privado son cosas que están permitidas y son posibles en C #. Esta no es una cuestión de cómo hacer estas cosas, están bien documentadas, mi pregunta es: ¿por qué?
Si establece un campo / miembro / método como privado / interno, ¿por qué C # como lenguaje permitiría que estos campos se establezcan fuera del alcance? Pensaría que esto arrojaría una excepción de algún tipo. Si la clase quisiera que se cambien o se establezcan, ¿no habría un método o un constructor?
A veces, tienes que hacer trampa.
Es fácil decir que la clase debe tener un setter para algo si es necesario establecerlo, pero ¿qué pasa si no puede agregar uno? ¿Qué pasa si no es su clase, es una biblioteca patentada y necesita solucionar un error? No digo que debas hacer tales cosas, de hecho, diría que casi con certeza no deberías hacerlo, pero a veces la única forma de hacer que algo funcione es hacer trampa de forma escandalosa. En esos casos, el hecho de que estos mecanismos existen es extremadamente útil.
Sin embargo, siempre debe cuestionar su uso y, por supuesto, tenga en cuenta que es probable que la violación de la API pública de un objeto le cause problemas más adelante y probablemente sea lo incorrecto. Excepto en el escenario mencionado anteriormente, cuando es la única forma en que puede hacer que algo funcione en algún código que no tiene la capacidad de cambiar.
Una cosa a tener en cuenta es que C ++ y sus derivados tienen un fuerte control de acceso, pero hay muchos lenguajes OOP que no lo tienen. Los objetos Perl 5, por ejemplo, están completamente abiertos a la interferencia externa, y los métodos y datos privados solo están ahí por convención: un programador de Perl sabe que meterse dentro del hashref de un objeto de terceros probablemente va a romper las cosas, por lo que generalmente ganó no hagas eso De nuevo, como con las capacidades de reflexión de C #, a veces puedes resolver muchísimos problemas con un pequeño ajuste a algo que realmente no debes tocar.
Pero reitero una vez más, casi seguro que no deberías hacerlo. Estas capacidades no son para uso diario.
Buena pregunta.
Mi respuesta sería: los modificadores de acceso y la visibilidad son parte del diseño de la API. Con la reflexión, usted tiene control total sobre casi todo, incluida la omisión de la API y la modificación de datos en el nivel bajo.
Los modificadores de acceso pueden proteger sus clases de cambios accidentales desde el exterior. Puede llamar a un método o acceder a un miembro público "por accidente". Con reflexión, es difícil mantener que hiciste las cosas por accidente.
Y si este acceso de bajo nivel en la reflexión NO fuera posible, muchas cosas que todos hemos llegado a conocer y que nos gustaría serían prácticamente imposibles.
Es imposible evitar que alguien pueda hacer eso. Podrías hacerlo más difícil, podrías obligarlos a usar un código inseguro y comenzar a fijar bits a ciegas. Después de todo, es su programa / máquina, están autorizados a hacer tales cosas.
El diseño del lenguaje es tal que le dificulta dispararse en el pie y hacer cosas malas. Pero no los hace imposibles, al hacerlo también restringiría a los usuarios a hacer cosas que son inusuales, pero aún deseables.
La reflexión es cómo interactúas con el código compilado. Si la reflexión respetara las expectativas del idioma de origen sobre la privacidad, habría una necesidad de otro mecanismo similar que no lo hiciera. Tortugas hasta abajo.
Comienza asumiendo que lo que hace es lo que debe hacer, luego reevaluar tu suposición de que fue un esfuerzo equivocado hacer algo diferente que nadie quiere hacer de todos modos.
La reflexión privada requiere que se le otorgue una confianza esencialmente plena. La plena confianza significa plena confianza . Si eres totalmente confiable para estar haciendo lo correcto, ¿por qué no debería funcionar?
(De hecho, el modelo de seguridad para la reflexión privada es en realidad mucho más complicado de lo que lo he esbozado aquí, pero eso no afecta mi punto: esta capacidad está sujeta a políticas . Consulte Consideraciones de seguridad para la reflexión (MSDN) para obtener información general de cómo interactúan la política de reflexión y seguridad).
Los modificadores de visibilidad no son para seguridad.
Simplemente están destinados a hacer que el trabajo con APIs / bases de código estructuradas sea más efectivo, para no aturdir al programador con guff, y solo exponer las cosas que deberían preocupar a los consumidores.
Ni siquiera puedo ver mi cara sin algo reflexivo. De acuerdo, puedo verme a mí mismo en un video, pero eso lo hace el dispositivo óptico llamado cámara, y también es algo que utiliza la técnica de la reflexión.
Si estuviera enfermo, posiblemente ya estaría muerto cuando los médicos necesiten radiografías para diagnosticar y tratar mi enfermedad, pero todo tipo de reflexiones no pueden ver lo que es privado de mí. Y tampoco puedo verme a mí mismo.
La radiografía (o algo similar a una tomography ) puede mirar dentro de mí, lo que nunca puedo hacer sin ella.
Prefiero decir que es más realista que la reflexión. Pero sí, no puedo usar mis ojos para ver al verdadero yo directamente, cada uno de mí que he visto alguna vez, era una especie de reflejo. (Para pensarlo en profundidad, los ojos también nos dan el reflejo de la realidad).
Entonces, se supone que la reflexión está relacionada con lo realista, sin una visión particular. Y puede suponer que el código del consumidor está restringido a BindingFlags.Public, dentro de las reglas de orientación a objetos.
En el universo real, casi nada es imposible; la única diferencia entre posible e imposible para nosotros, es si se puede hacer por humanos, ya que somos seres humanos.
Parece peligroso que la reflexión puede hacer de todo en el universo de los programas, y ahora se requiere que se confíe plenamente por razones de seguridad, en la lógica de un ser humano.
Porque los modificadores de acceso están ahí para ayudar a documentar la API que desea exponer a los consumidores, a herederos, etc.
No son un mecanismo de control de acceso / seguridad.
Un caso en el código de producción:
Queríamos que un servicio web funcionara en la zona horaria de Nueva Zelanda. Probablemente la solución correcta es reescribir todo nuestro código (incluido algún código de serialización .NET Framework) para usar DateTimeOffset
, pero la solución más simple fue efectivamente ajustar los dos campos privados en .NET Framework que almacenan la zona horaria actual (normalmente basada en el registro llamadas) para usar la zona horaria de NZ de forma explícita.
Sabemos que si .NET Framework versión 2.0 se actualiza alguna vez en su manejo de zonas horarias, es posible que tengamos que volver a trabajar con nuestro código, pero por el momento esto está funcionando bien en producción.