tengo una clase que he marcado como interna y marqué campos y métodos como público. Se compiló sin errores ni advertencias. ¿Existe alguna necesidad específica de tener métodos tan públicos y de clase como internos (excepto cuando se implementan desde interfaces o clases)?Por qué C# permite métodos/miembros sean públicas cuando la clase es interno
Respuesta
no tiene efectos adversos, y también significa que si alguna vez decide hacer público el tipo, no será necesario cambiar la accesibilidad de sus miembros.
Básicamente para un miembro:
pública significa que el miembro es visible para cualquiera que pueda ver el tipo.
interna significa que el miembro solo es visible en el ensamblaje actual, incluso si el Tipo es públicamente visible.
De modo que su elección se basaría en cuál de ellas es la más adecuada. En general, es más apropiado hacer que los miembros sean públicos (es decir, visibles para cualquiera que pueda ver el Tipo, es decir, parte de la API pública del Tipo). Hará que los miembros sean internos por la misma razón que hace que los miembros sean internos en una clase pública, generalmente miembros auxiliares que solo deberían ser visibles para las clases "amigas" en el mismo ensamblado, y no forman parte de la API pública.
Además, un Tipo interno puede derivar de un Tipo público, por lo que puede heredar y anular a los miembros públicos. ¿Tendría sentido permitir a los miembros públicos anulados, pero no a los nuevos miembros públicos?
Buena explicación Joe, ¿hay algún otro uso (aparte desde "si alguna vez decide hacer que el tipo sea público, no necesitará cambiar la accesibilidad de sus miembros") por tener métodos públicos y tipo internos? – Ravisha
"hay otro uso" - no hay diferencia. Por lo tanto, generalmente haré que los miembros sean públicos a menos que haya una razón explícita para hacerlo interno, es decir, a menos que sean internos para un tipo público (generalmente miembros auxiliares que no deberían ser visibles en la API pública, pero accesibles para clases de "amigos"). en el mismo conjunto. – Joe
Una clase marcado como interna con métodos públicos permitiría otras clases de la misma assemly hacer referencia a esos métodos.
Un uso común de acceso interno está en desarrollo basado en componentes, ya que permite a un grupo de componentes a cooperar de manera privada y sin ser expuesto al resto de la aplicación código. Por ejemplo, un marco para la construcción de interfaces de usuario gráfica podría proporcionar clases de control y de formulario que cooperan usando miembros con acceso interno. Desde estos miembros son internos, que son no expuesto a código que está utilizando el marco .
Es un error hacer referencia a un tipo o un miembro con acceso interno fuera el conjunto dentro del cual era definido.
Editar
De Scope of internal method in C#?
Es posible que desee a un método en una clase pública que puede ser llamado por otros clases en la asamblea, pero no por clientes de la montaje.
de acuerdo. Aún si marco el método como interno, puedo recomendarlo dentro del ensamblaje. !! – Ravisha
No hay advertencia porque no tiene ningún efecto adverso. De todas maneras, no se podrá acceder a los miembros desde otras asambleas, ya sea que los marques como públicos o internos.
Considere este caso:
Usted tiene una FooFactory la creación de objetos de aplicación IFoo. Sus implementaciones IFoo pueden ser internas porque no desea exponerlas a otros ensambles que solo usan IFoo. Los miembros de la implementación IFoo deben ser públicos para que puedan ser utilizados en las otras asambleas.
Por lo tanto, como he leído toda su pregunta, no creo que haya ninguna razón para que los métodos en las clases internas sean públicos a menos que haya una forma de acceder a esas clases desde otras asambleas a través de interfaces o clases base
- 1. Tener propiedades públicas en la clase C++
- 2. ¿Por qué usar propiedades públicas para campos privados en C#?
- 3. ¿Por qué no se permite que las clases selladas sean restricciones de tipo genérico?
- 4. ¿Por qué C++ no permite estructuras anónimas?
- 5. ¿Qué es C# 'interno' en VB.net?
- 6. ¿Por qué C++ no permite la amistad heredada?
- 7. En C++, ¿por qué struct es, de hecho, clase?
- 8. ¿Es malo tener variables públicas en una clase no estática?
- 9. ¿Por qué mis propiedades públicas no están serializadas por XmlSerializer?
- 10. ¿Por qué no se permite nulo para DateTime en C#?
- 11. ¿Por qué prefieren Propiedades a variables públicas?
- 12. ¿Por qué la clase String es definitiva?
- 13. ¿Por qué se permite la cadena de caracteres y el compilador no permite int int?
- 14. En Scala, ¿qué sucede cuando un objeto interno extiende la clase que lo incluye?
- 15. ¿Por qué C# no permite un typeof como parámetro predeterminado?
- 16. C# clase estática ¿por qué usar?
- 17. ¿Por qué Task.Delay() permite un retraso infinito?
- 18. ¿Por qué `sudo` es lento cuando la contraseña es incorrecta?
- 19. content_tags anidados escape html interno ... ¿por qué?
- 20. ¿Por qué se permite T() = T()?
- 21. ¿Por qué mi clase no es aceptable?
- 22. ¿Por qué el enlazador ld permite múltiples definiciones de clase con los mismos métodos?
- 23. C# ¿por qué necesita struct si la clase puede cubrirlo?
- 24. ¿Cómo obtener propiedades públicas de una clase?
- 25. ¿Por qué DecimalFormat permite caracteres como sufijo?
- 26. ¿Por qué no se permite System.out.println (super)?
- 27. ¿Por qué se permite llamar al método virtual privado de la clase derivada mediante el puntero de la clase base?
- 28. Por qué Python no permite guiones
- 29. ¿Por qué la clase de usuario no es equivalente a self.class, cuando parece tan similar?
- 30. VC++ permite usar tipos const para contenedores STL. ¿Por qué?
Tal vez no haya ningún efecto secundario, por lo que revisar esto sería superfluo. –
Ya estoy de acuerdo en que no hay efecto secundario, pero mi pregunta en sí era si hay algún caso de uso específico en el que esto sea útil. – Ravisha