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.
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.
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)
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
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.
Respuestas:
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).
fuente
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.
Referencia:
dotnetbull: ¿qué es el modificador de acceso en C #?
fuente
Protected Internal
proporciona un acceso más amplio queProtected
.protected internal
comoprotected OR internal
.With Type
significaAND
esa matriz para verdadero | falso | falso | falso paraprotected internal
. No es intuitivo. en cambio es cierto | verdadero | verdadero | falso como siOR'd
.private protected
no son muy intuitivas. Para más detalles: docs.microsoft.com/en-us/dotnet/csharp/language-reference/…internal
los 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 )private
los 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
protected
miembros son comoprivate
miembros, 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)fuente
privado - encapsulaciones en clase / alcance / estructura ect '.
interno - encapsulación en ensambles.
fuente
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
fuente
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
fuente
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.
fuente