¿Cuál es la diferencia entre 'protegido' y 'protegido interno'?


244

¿Alguien puede explicarme la diferencia entre modificadores 'protegidos' y 'protegidos internos' en C #? Parece que se comportan de la misma manera.

Respuestas:


402

El modificador de acceso "protegido interno" es una unión de los modificadores "protegido" e "interno".

Desde MSDN, Modificadores de acceso (Guía de programación de C #) :

protegido :

Solo se puede acceder al tipo o miembro por código en la misma clase o estructura, o en una clase que se deriva de esa clase.

interno :

Se puede acceder al tipo o miembro mediante cualquier código en el mismo ensamblado, pero no desde otro ensamblado.

interno protegido :

Se puede acceder al tipo o miembro mediante cualquier código en el ensamblado en el que se declara, O desde una clase derivada en otro ensamblaje. El acceso desde otro ensamblado debe realizarse dentro de una declaración de clase que se deriva de la clase en la que se declara el elemento interno protegido, y debe realizarse a través de una instancia del tipo de clase derivada.

Tenga en cuenta que : protected internalsignifica " protectedO internal" (cualquier clase en el mismo ensamblaje, o cualquier clase derivada, incluso si está en un ensamblaje diferente).

... y para completar:

privado :

Solo se puede acceder al tipo o miembro por código en la misma clase o estructura.

público :

Se puede acceder al tipo o miembro mediante cualquier otro código en el mismo ensamblado u otro ensamblado que lo haga referencia.

privado protegido :

El acceso está limitado a la clase que contiene o los tipos derivados de la clase que contiene dentro del ensamblaje actual.
( Disponible desde C # 7.2 )


2
¿Puedo tener un miembro protected internalpara que esté protecteden el ensamblaje actual y no esté disponible externamente por completo?
Shimmy Weitzhandler

8
Eso estaría "protegido", ¿no?
CAD bloke

2
@Shimmy: puedes tener una clase interna con métodos protegidos . Pero entonces toda la clase no estará disponible desde ensamblajes externos.
M4N

1
@Shimmy eche un vistazo a esta propuesta para una versión futura de C # github.com/dotnet/roslyn/blob/features/privateProtected/docs/…
Nate Cook

@Shimmy Al menos CLR admite el concepto de la intersección de accesibilidad protegida e interna, pero el lenguaje C # no. C # solo admite la unión de los dos modificadores de acceso.
RBT

89

protected puede ser utilizado por cualquier subclase de cualquier ensamblaje.

protected internales todo lo que protectedes, además también cualquier cosa en el mismo ensamblado puede acceder a él

Es importante destacar que no significa "subclases en el mismo conjunto": es la unión de los dos, no la intersección.


3
Solo para su información para los lectores, CLR admite el concepto de la intersección de accesibilidad protegida e interna también, pero C # no lo admite. C # solo admite la unión de los dos como se menciona en esta publicación.
RBT

1
Solo otro FYI para lectores, las "subclases en el mismo ensamblaje" se pueden lograr con el private protectedmodificador de acceso que se introdujo en C # 7.2
LordWilmore

52

- Actualización de respuesta 2019 -

Puede encontrar la diferencia en la tabla de accesibilidad basada en sí es sí,

ingrese la descripción de la imagen aquí


44
Hermosa respuesta, comunica muy claramente las diferencias entre cada modificador de acceso.
e_i_pi

23

En la práctica, sobre los métodos:

protegido : accesible para clases heredadas, de lo contrario privado.

interno - público solo para clases dentro de la asamblea, de lo contrario privado.

protegido interno - significa protegido o interno - los métodos se vuelven accesibles para las clases heredadas y para cualquier clase dentro del ensamblado.


1
Usaría OR para expresar esa causa, ya sea que no sea ambos lo que tiene que ser cierto.
Brian Rasmussen

No estoy completamente de acuerdo con la parte "para cambiar el comportamiento de la clase base" en la descripción de "protegido". Yo diría que aquí es donde usas "virtual" (en la clase base) y "anular" (en la clase derivada).
M4N

¿Hay alguna manera de marcar a un miembro como protectedAND internal?
Shimmy Weitzhandler

@Shimmy: sí, protected internal.
abatishchev

1
@Shimmy dos años después, y sí. Ahora hay una manera en C # 7.2. Se llama private protected docs.microsoft.com/en-us/dotnet/csharp/language-reference/…
Pauli Østerø

10

Todavía hay mucha confusión al comprender el alcance de los accesos "internos protegidos", aunque la mayoría tiene la definición definida correctamente. Esto me ayudó a comprender la confusión entre "protegido" y "protegido interno":

public es realmente public dentro y fuera de la asamblea ( public internal / public external )

protegido está realmente protegido dentro y fuera del ensamblaje ( protegido interno / protegido externo ) (no permitido en clases de nivel superior)

privado es realmente privado dentro y fuera del ensamblaje ( privado interno / privado externo ) (no permitido en clases de nivel superior)

interno es realmente público dentro de la asamblea pero excluido fuera de la asamblea como privado ( público interno / externo excluido )

protegido interno es realmente público dentro de la asamblea pero protegido fuera de la asamblea ( público interno / externo protegido ) (no permitido en clases de nivel superior)

Como puede ver, la protección interna es una bestia muy extraña. No es intuitivo

Eso ahora plantea la pregunta de por qué Microsoft no creó un ( protegido interno / excluido externo ), o supongo que algún tipo de "privado protegido" o "interno protegido". jajaja Parece incompleto?

A la confusión se agrega el hecho de que puede anidar miembros anidados internos públicos o protegidos dentro de tipos protegidos, internos o privados. ¿Por qué accedería a un "interno protegido" anidado dentro de una clase interna que excluye el acceso externo al ensamblado?

Microsoft dice que tales tipos anidados están limitados por su alcance de tipo primario, pero eso no es lo que dice el compilador. Puede compilar componentes internos protegidos dentro de clases internas que deberían limitar el alcance solo al ensamblado.

Para mí esto se siente como un diseño incompleto. Deberían haber simplificado el alcance de todos los tipos a un sistema que considere claramente la herencia, pero también la seguridad y la jerarquía de los tipos anidados. Esto habría hecho que el intercambio de objetos sea extremadamente intuitivo y granular en lugar de descubrir la accesibilidad de los tipos y miembros basados ​​en un sistema de alcance incompleto.


1
privado protegido ahora se ha agregado a C # 7.2, que es básicamente interno Y protegido.
Pauli Østerø

7

protegido : la variable o método estará disponible solo para las clases secundarias (en cualquier ensamblado)

interno protegido : disponible para las clases secundarias en cualquier conjunto y para todas las clases dentro del mismo conjunto


3

He leído definiciones muy claras para estos términos.

Protegido: el acceso está limitado a la definición de clase y a cualquier clase que herede de la clase. Solo se puede acceder al tipo o miembro por código en la misma clase o estructura o en una clase que se deriva de esa clase.

Interno: el acceso se limita exclusivamente a las clases definidas dentro del conjunto del proyecto actual. Solo se puede acceder al tipo o miembro por código en la misma clase.

Protegido-Interno: El acceso está limitado al ensamblaje actual o tipos derivados de la clase que lo contiene.


1

Miembro protegido

Miembro protegido de una clase solo disponible en la clase contenida (en la que se ha declarado) y en la clase derivada dentro del ensamblado y también fuera del ensamblado.

Significa si una clase que reside fuera del ensamblado puede usar el miembro protegido del otro ensamblado heredando solo esa clase.

Podemos exponer al miembro protegido fuera del ensamblado heredando esa clase y usarlo solo en la clase derivada.

Nota: Los miembros protegidos no son accesibles usando el objeto en la clase derivada.

Miembro interno

El miembro interno de una clase está disponible o tiene acceso dentro del ensamblaje, ya sea creando un objeto o en una clase derivada, o puede decir que es accesible en todas las clases dentro del ensamblaje.

Nota: Los miembros internos no son accesibles fuera del ensamblaje, ya sea mediante la creación de objetos o en una clase derivada.

Interno protegido

El modificador de acceso interno protegido es una combinación protegida o interna.

El miembro interno protegido puede estar disponible en todo el ensamblado en el que declaró la creación de un objeto o heredado esa clase. Y solo se puede acceder fuera del ensamblado en una clase derivada.

Nota: El miembro interno protegido funciona como interno dentro del mismo conjunto y funciona como protegido para fuera del conjunto.


1

public : se puede acceder a los miembros (funciones y variables) declarados como públicos desde cualquier lugar.

privado : no se puede acceder a los miembros privados desde fuera de la clase. Este es el especificador de acceso predeterminado para un miembro, es decir, si no especifica un especificador de acceso para un miembro (variable o función), se considerará privado. Por lo tanto, cadena PhoneNumber; es equivalente a la cadena privada PhoneNumber.

protegido : solo se puede acceder a los miembros protegidos desde las clases secundarias.

interno : solo se puede acceder dentro del mismo ensamblaje.

Protegido interno : se puede acceder dentro del mismo ensamblado, así como en clase derivada.


0

Las mejores suites internas protegidas cuando desea que un miembro o tipo se use en una clase derivada de otro ensamblaje al mismo tiempo solo desea consumir el miembro o escribir en el ensamblado padre sin derivar de la clase donde se declara. Además, si solo desea usar un miembro o un tipo sin derivar de otra clase, en el mismo ensamblaje puede usar solo interno.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.