¿Alguien puede explicarme la diferencia entre modificadores 'protegidos' y 'protegidos internos' en C #? Parece que se comportan de la misma manera.
fuente
¿Alguien puede explicarme la diferencia entre modificadores 'protegidos' y 'protegidos internos' 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 programación de C #) :
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 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 :
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.
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 )
protected internal
para que estéprotected
en el ensamblaje actual y no esté disponible externamente por completo?protected
puede ser utilizado por cualquier subclase de cualquier ensamblaje.protected internal
es todo lo queprotected
es, además también cualquier cosa en el mismo ensamblado puede acceder a élEs importante destacar que no significa "subclases en el mismo conjunto": es la unión de los dos, no la intersección.
fuente
private protected
modificador de acceso que se introdujo en C # 7.2- Actualización de respuesta 2019 -
Puede encontrar la diferencia en la tabla de accesibilidad basada en sí es sí,
fuente
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.
fuente
protected
ANDinternal
?protected internal
.private protected
docs.microsoft.com/en-us/dotnet/csharp/language-reference/…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.
fuente
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
fuente
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.
fuente
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.
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.
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.
fuente
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.
fuente
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.
fuente