c# - privado - métodos públicos vs. internos en una clase interna
modificadores de acceso c# (7)
De acuerdo con la documentación de msdn, su clase Foo no será accesible fuera de su ensamblado, por lo que no hace ninguna diferencia marcar los métodos como internos o públicos; incluso no hace la diferencia usando el Atributo Internals VisibleTo
internal class Foo
{
public void Fee()
{
Debug.WriteLine("Fee");
}
internal void Fi()
{
Debug.WriteLine("Fi");
}
}
Estoy pensando que Fee () y Fi () son igualmente accesibles ya que toda la clase ya es interna. ¿Estoy pasando por alto algo? ¿Hay alguna razón para elegir público o interno para los métodos en un caso como este?
En realidad, hay una gran diferencia si estás usando la reflexión; en particular, Silverlight puede enojarse mucho si intenta acceder a los métodos internos a través de la reflexión, incluso si hubiera tenido acceso. He visto ocasiones en las que he tenido que hacer público un método para que el código funcione en Silverlight, aunque funciona en .NET regular.
Puede encontrar lo mismo con confianza parcial en .NET regular.
Estás en lo correcto, tanto Fee como Fi serán igualmente accesibles.
De la especificación de lenguaje CSharp 3.0, en 3.5.2:
El dominio de accesibilidad de un miembro anidado M declarado en un tipo T dentro de un programa P se define de la siguiente manera (teniendo en cuenta que M puede ser posiblemente un tipo):
• Si la accesibilidad declarada de M es pública, el dominio de accesibilidad de M es el dominio de accesibilidad de T.
Por lo tanto, incluso si Fee se declara como pública, será tan accesible como Foo (es decir, interna).
Haría la diferencia cuando quisieras que tu clase interna implementara una interfaz. El método que es una implementación de alguna interfaz, debería ser público.
La declaración internal class Foo
anulará la accesibilidad del método public void Fee()
, haciéndolo interno de manera efectiva.
En este caso, usar interno vs. público en los métodos tendrá el mismo efecto. La única razón por la que elegiría los métodos públicos frente a los métodos internos en un caso como este sería facilitar la transición a una clase pública en una versión futura, si así lo desea.
Lo único que falta aquí en la respuesta es por qué harías esto?
Algunas bibliotecas tienen muchas clases que no están destinadas para el consumidor de la biblioteca, pero deben heredar las interfaces marcadas como públicas. Por ejemplo, tengo una biblioteca con una clase que hereda la interfaz IComparer pero solo se usa internamente y no quiero saturar el aspecto público de mi biblioteca. Si marco la función de comparación implementada como interna, el compilador se queja de que no estoy implementando la interfaz IComparer.
Entonces, ¿cómo implemento con éxito la interfaz y, al mismo tiempo, evito que sea accesible en el aspecto público de mi biblioteca? Marque la clase como interna pero la función implementada como pública.
Solo usaría métodos internos si una clase es interna. En caso de que cambies de opinión y hagas pública la clase, simplemente puedes reemplazar el texto y listo.