¿Cuál es la diferencia entre ‘protegido’ e ‘protegido interno’?

¿Puede alguien explicarme la diferencia entre modificadores “protegidos” y “internos protegidos” en C #? Parece que se comportan de la misma manera.

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

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

protegido :

Se puede acceder al tipo o miembro solo 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 ensamblaje, pero no desde otro ensamblado.

protegido interno :

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

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

… y para completar:

privado :

Se puede acceder al tipo o miembro solo 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 conjunto u otro conjunto que lo haga referencia.

privado protegido :

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

protected puede ser utilizado por cualquier subclase de cualquier ensamblaje.

protected internal es todo lo que está protected , y también cualquier cosa en el mismo conjunto 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.

En la práctica, sobre métodos:

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

interno : público solo para las clases dentro del ensamblado, de lo contrario, privado.

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

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

interno protegido : disponible para clases de niños en cualquier ensamblaje y para todas las clases dentro del mismo ensamblaje

Todavía hay mucha confusión en la comprensión del scope de los descriptores de acceso “protegidos internos”, aunque la mayoría tiene la definición definida correctamente. Esto me ayudó a entender la confusión entre “protegido” e “interno protegido”:

público es realmente público dentro y fuera de la asamblea ( público interno / público externo )

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

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

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

el interno protegido es realmente público dentro del conjunto, pero está protegido fuera del ensamblaje ( público interno / externo protegido ) (no permitido en las clases de nivel superior)

Como puedes ver internamente protegida, es una bestia muy extraña. No es intuitivo.

Eso ahora plantea la pregunta de por qué Microsoft no creó un ( externo interno / externo protegido ), o supongo que algún tipo de “protección privada” o “protección interna”? lol. Parece incompleto?

A la confusión se agrega el hecho de que puede anidar miembros internos o protegidos nesteds dentro de tipos protegidos, internos o privados. ¿Por qué accedería a un “interno protegido” nested dentro de una clase interna que excluye el acceso al ensamblaje externo?

Microsoft dice que tales tipos nesteds están limitados por su scope tipo padre, pero eso no es lo que dice el comstackdor. Puede comstackr elementos internos protegidos dentro de las clases internas, lo que debería limitar el scope solo al ensamblaje.

Para mí, esto parece un diseño incompleto. Deberían haber simplificado el scope de todos los tipos a un sistema que considere claramente la herencia, pero también la seguridad y la jerarquía de los tipos nesteds. Esto habría hecho que el intercambio de objetos sea extremadamente intuitivo y granular en lugar de descubrir la accesibilidad de tipos y miembros en función de un sistema de scoping incompleto.

Leí definiciones muy claras para estos términos.

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

Interno: el acceso está limitado exclusivamente a las clases definidas dentro del ensamblaje de proyecto actual. Se puede acceder al tipo o miembro solo por código en la misma clase.

Interno protegido: el acceso está limitado al ensamblaje actual o a los tipos derivados de la clase contenedora.

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 ensamblaje 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 el miembro protegido fuera del ensamblado por herencia de 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 ensamblado ya sea creando un objeto o en una clase derivada o puede decir que es accesible a través de todas las clases dentro del ensamblaje.

Nota: No se puede acceder a los miembros internos fuera del ensamblado, ya sea mediante la creación de objetos o en una clase derivada.

Protegido interno

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

El Miembro interno protegido puede estar disponible dentro de todo el conjunto en el que declaró bien crear objeto o bien heredar esa clase. Y puede ser accesible fuera del ensamblado solo en una clase derivada.

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

public – Se puede acceder a los miembros (Functions & 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á como privado. Por lo tanto, string PhoneNumber; es equivalente a la cadena privada PhoneNumber.

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

interno : se puede acceder solo dentro del mismo conjunto.

interno protegido : se puede acceder dentro del mismo conjunto y en la clase derivada.

Puede encontrar la diferencia en la tabla a continuación, la accesibilidad basada es sí,

enter image description here

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