Modificadores de acceso interno versus privado

Respuestas:

516

interno es para el alcance del ensamblaje (es decir, solo accesible desde el código en el mismo .exe o .dll)

private es para el alcance de la clase (es decir, accesible solo desde el código de la misma clase).

explorador
fuente
66
Tengo una pregunta rápida; si declaro que una clase es privada en un espacio de nombres dentro de un ensamblado versus la clase es interna, puedo acceder a esa clase dentro del ensamblaje en ambos casos, entonces ¿cuál es la diferencia entre una clase privada y una clase interna? ¿o se usan modificadores privados e internos en términos de clases cuando se anidan clases dentro de clases?
mayotic
2
agregué el proyecto / ensamblaje específico como referencia de otro proyecto y tanto privados como internos me impiden acceder a esta clase en particular dentro del espacio de nombres, así que de nuevo ... ¿la diferencia entre clases privadas e internas es? gracias
mayotic
99
No puede declarar una clase de nivel superior como privada. El compilador te detendrá.
TheGateKeeper
66
@NetSkay: si declara una clase privada dentro de una clase pública, entonces esta clase no es accesible por otras clases en su ensamblado, pero si declara esta clase como interna, entonces sería accesible en el ensamblado. Aunque, ambos no serán accesibles fuera de la asamblea.
Yogesh Jindal
2
Si viene de un fondo VB.NET, la palabra clave "interna" de C # es equivalente a la palabra clave "Friend" de VB.NET.
Brain2000
207

Encuentra una explicación a continuación. Puede consultar este enlace para obtener más detalles: http://www.dotnetbull.com/2013/10/public-protected-private-internal-access-modifier-in-c.html

Privado: los miembros privados solo son accesibles dentro del tipo propio (clase propia).

Interno: los miembros internos solo son accesibles dentro del ensamblaje por herencia (su tipo derivado) o por instancia de clase.

ingrese la descripción de la imagen aquí

Referencia:

dotnetbull: ¿qué es el modificador de acceso en C #?

Vivek
fuente
17
Interesante que Protected Internalproporciona un acceso más amplio que Protected.
Dan Bechard
99
@ Dan, totalmente de acuerdo. Puede ser útil leer y pensar protected internalcomo protected OR internal.
chessofnerd
77
Que With Typesignifica
James Wierzba
@Dan sí, supuse que simplemente actuaría como una tabla de verdad y ANDesa matriz para verdadero | falso | falso | falso para protected internal. No es intuitivo. en cambio es cierto | verdadero | verdadero | falso como si OR'd.
ferr
1
Por cierto, C # 7.2 acaba de agregar un modificador "protegido E interno", aunque las palabras clave reales elegidas private protectedno son muy intuitivas. Para más detalles: docs.microsoft.com/en-us/dotnet/csharp/language-reference/…
Joe Sewell
70

internallos miembros son visibles para todo el código en el ensamblado en el que se declaran.
(Y para otros ensamblados a los que se hace referencia usando el [InternalsVisibleTo]atributo )

privatelos miembros solo son visibles para la clase declarante. (incluidas las clases anidadas)

No se puede declarar una clase externa (no anidada) private, ya que no hay un ámbito de contención para que sea privada.

Para responder la pregunta que olvidó hacer, los protectedmiembros son como privatemiembros, pero también son visibles en todas las clases que heredan el tipo de declaración. (Pero solo en una expresión de al menos el tipo de la clase actual)

SLaks
fuente
8

privado - encapsulaciones en clase / alcance / estructura ect '.

interno - encapsulación en ensambles.

Yaniv Lugassy
fuente
6

Solo se puede acceder a los miembros privados dentro del cuerpo de la clase o la estructura en la que se declaran.

Solo se puede acceder a los tipos o miembros internos dentro de los archivos en el mismo ensamblado

Jesper Fyhr Knudsen
fuente
Entonces, ¿cuál es la diferencia en el uso de esto? todavía no lo entiendo: X
deadfish
44
Los privados son accesibles desde dentro de la clase solamente, los internos son accesibles desde la Asamblea (proyecto en VS, es decir, archivo dll / exe).
Jesper Fyhr Knudsen
3

Interno le permitirá hacer referencia, por ejemplo, a una clase estática de acceso a datos (para seguridad de subprocesos) entre múltiples clases de lógica de negocios, mientras no se suscribe para heredar esa clase / viaje entre sí en grupos de conexiones, y finalmente evitar permitir una clase DAL para promover el acceso a nivel público. Esto tiene innumerables respaldos en diseño y mejores prácticas.

Entity Framework hace buen uso de este tipo de acceso

Nathan Teague
fuente
0

los miembros internos son accesibles dentro de la asamblea (solo accesibles en el mismo proyecto)

los miembros privados son accesibles dentro de la misma clase

Ejemplo para principiantes

Hay 2 proyectos en una solución (Project1, Project2) y Project1 tiene una referencia a Project2.

  • El método público escrito en Project2 será accesible en Project2 y Project1
  • El método interno escrito en Project2 será accesible solo en Project2 pero no en Project1
  • El método privado escrito en la clase1 del Proyecto2 solo será accesible para la misma clase. Tampoco será accesible en otras clases del Proyecto 2 que no estén en el Proyecto 1.
Salik
fuente