2010-02-15 6 views
8

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

+0

Tal vez no haya ningún efecto secundario, por lo que revisar esto sería superfluo. –

+0

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

Respuesta

8

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?

+0

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

+0

"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

5

Una clase marcado como interna con métodos públicos permitiría otras clases de la misma assemly hacer referencia a esos métodos.

internal (C# Reference)

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.

+0

de acuerdo. Aún si marco el método como interno, puedo recomendarlo dentro del ensamblaje. !! – Ravisha

1

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.

0

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

+0

Querido Andrew: He mencionado en la pregunta, excepto la interfaz y la clase base. – Ravisha

+0

Heh ... eso es lo que recibo por intentar responder preguntas mientras un niño pequeño intenta robarme el mouse ... –

+0

Puede ser hora de que deje de jugar con ratones :) – Ravisha

Cuestiones relacionadas