2009-02-25 26 views

Respuesta

286

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

De MSDN, Access Modifiers (C# Programming Guide):

protected:

El tipo o miembro sólo se puede acceder por código en la misma clase o struct, o en una clase que se deriva de esa clase.

internal:

El tipo o miembro se puede acceder por cualquier código en el mismo conjunto, pero no de otro conjunto.

interna protegida:

El tipo o miembro se puede acceder por cualquier código en el conjunto en el que se declara, O desde dentro de una clase derivada en otro conjunto de . El acceso desde otro ensamblado debe tener lugar dentro de una declaración 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.

Nota que: protected internal significa "protected O internal" (cualquier clase en el mismo conjunto, o cualquier clase derivada - incluso si es en un conjunto diferente).

... y para lo completo:

private:

El tipo o miembro sólo se puede acceder con el código de la misma clase o estructura.

public:

El tipo o miembro se puede acceder por cualquier otro código en el mismo conjunto o otro conjunto que hace referencia a ella.

private protected:

acceso está limitado a la clase que contiene o tipos derivados de la clase que contiene dentro del conjunto actual.
(Disponible a partir de C# 7,2)

+1

¿Puedo tener un miembro 'protected internal' para que esté' protected' en el ensamblaje actual y no esté completamente disponible externamente? – Shimmy

+5

Eso sería "Protegido", ¿no es así? –

+2

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

77

protected puede ser utilizado por cualquier subclase de cualquier montaje.

protected internal es todo lo que protected es, además, cualquier elemento 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.

+3

Solo un FYI para los lectores que CLR también apoya el concepto de la intersección de la accesibilidad protegida y la interna, pero C# no lo admite. C# solo admite la unión de los dos como se menciona en esta publicación. – RBT

22

En la práctica, unos métodos:

protegidos - accesible para las clases heredadas, de otro modo privado.

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

protegidas internos - medios protegidos o interna - métodos se hacen accesibles para las clases heredadas y para cualquier clase de interior del conjunto.

+1

Yo usaría O para expresar esa causa, ya sea que no sea ambas cosas, eso tiene que ser cierto. –

+0

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 se usa "virtual" (en la clase base) y "anulación" (en la clase derivada). – M4N

+0

¿Hay alguna manera de marcar a un miembro como 'protegido' Y' interno'? – Shimmy

6

protegida: la variable o método estarán disponibles sólo para clases hijas (en cualquier montaje)

interna protegida: disposición de clases del niño en cualquier conjunto de y a todas las clases dentro de la misma ensamblaje

1

public - Se puede acceder a los miembros (Funciones & 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.

protected - Solo se puede acceder a los miembros protegidos desde las clases secundarias.

interior - Se puede acceder solo dentro del mismo conjunto.

interno protegido - Se puede acceder dentro del mismo conjunto y en la clase derivada.

3

He leído 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.

Protegido-Interno: El acceso está limitado al ensamblaje actual o a los tipos derivados de la clase contenedora.

1

miembro protegido

miembro protegido de una clase en sólo está disponible en la clase de contenido (en el que ha sido declarado) y en la clase derivada dentro del conjunto y también el exterior del conjunto.

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

Podemos exponer el miembro protegido fuera del ensamblado heredado de esa clase y usarlo solo en la clase derivada.

Nota: No se puede acceder a los miembros protegidos utilizando el objeto en la clase derivada.

miembro interno

miembro interno de una clase está disponible o el acceso dentro del conjunto, ya sea la creación de objeto o en una clase derivada o se puede decir que es accesible a través de todas las clases dentro de la asamblea.

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

interna protegida

Protegida modificador de acceso interno es combinación protegido o internos.

El Miembro interno protegido puede estar disponible dentro de todo el conjunto en el que se declaró como objeto de creación o por herencia de 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 el exterior del conjunto.

5

Todavía hay mucha confusión en la comprensión del alcance de los accesos "internos protegidos", aunque la mayoría tiene la definición definida correctamente.Esto me ayudó a entender la confusión entre "protegido" y "interna protegida":

pública es realmente público en el interior y el exterior del conjunto (externa pública interna/pública)

protegida es realmente protegido en el interior y el exterior del conjunto (protegida interna/externa protegida) (no permitido en clases de nivel superior)

privado es el interior muy privado y el exterior del conjunto (privada interna/externa privada) (no permitido en las clases de nivel superior)

interna es realmente pública dentro del conjunto, pero excluidos fuera de la asamblea como privada (público interno/excluidos externo)

interna protegida es realmente público dentro del conjunto pero protegido el exterior del conjunto (público interno/externo protegido) (no permitido en clases de nivel superior)

Como puedes ver protegido interno es una bestia muy extraña. No es intuitivo.

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

Agregado a la confusión es el hecho de que puede anidar miembros internos o protegidos anidados 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 al ensamblaje externo?

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 elementos internos protegidos dentro de las clases internas, lo que debería limitar el alcance solo al ensamblaje.

Para mí, esto parece 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 tipos y miembros en función de un sistema de scoping incompleto.

+1

privado protegido ahora se ha agregado a C# 7.2 que es básicamente interno Y protegido. –

0

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 principal sin derivar de la clase donde se declara . Además, si solo desea utilizar un miembro o escribir sin derivar de otra clase, en el mismo ensamblaje puede usar solo interno.

Cuestiones relacionadas