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úblicos o internos para los métodos en un caso como este?
c#
public-method
ScottS
fuente
fuente
Respuestas:
La
internal class Foo
declaración anulará la accesibilidad delpublic void Fee()
método, convirtiéndolo efectivamente en interno.En este caso, el uso de interno frente a público en los métodos tendrá el mismo efecto. La única razón por la que elegiría métodos públicos frente a métodos internos en un caso como este sería para facilitar la transición a una clase pública en una versión futura, en caso de que decida hacerlo.
fuente
Lo único que falta aquí en la respuesta es ¿por qué harías esto?
Algunas bibliotecas tienen muchas clases que no están diseñadas para que las toque 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 Compare 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.
fuente
En realidad, existe una gran diferencia si utiliza la reflexión; en particular, Silverlight puede molestarse mucho si intenta acceder a 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 normal.
Puede encontrar lo mismo con la confianza parcial en .NET normal.
fuente
Haría una diferencia cuando desea que su clase interna implemente una interfaz. El método que es una implementación de alguna interfaz, tendría que ser Público.
fuente
Tiene razón, tanto Fee como Fi serán igualmente accesibles.
De CSharp Language Specification 3.0, bajo 3.5.2:
Entonces, incluso si Fee se declara como público, será tan accesible como Foo (es decir, interno).
fuente
Según la documentación de msdn, su clase Foo no será accesible fuera de su ensamblaje, por lo que no hace ninguna diferencia marcar los métodos como internos o públicos; ni siquiera hace diferencia al usar Attribute InternalsVisibleTo
fuente
Iría solo con métodos internos si una clase es interna. en caso de que cambie de opinión y haga pública la clase, puede hacer un reemplazo de texto y listo.
fuente