2012-06-09 24 views
15

Sólo quiero saber cuál es la diferencia real entre privado y protegido interno especificador de acceso. Como sé¿Cuál es la diferencia entre "privado" e "interno protegido"?

visible a miembros de la clase propios: privada y protegida interna

visible al objeto de otras clases: Tanto NO

Visible para objetos de otras clases fuera del colección de espacio de nombres: Tanto NO

visible al objeto de clases hijas fuera de la colección de espacio de nombres: Tanto NO

Si privada haciendo lo mismo que interna protegida entonces ¿por qué necesitamos los dos solo uno debería ser suficiente o no?

+1

La propiedad Type.IsFamilyOrAssembly será verdadera. O, no AND. –

+0

@HansPassant ¿No te entendí? Lo siento. – avirk

+1

Buen recurso: http://msdn.microsoft.com/en-us/library/wxh6fsc7 – Nope

Respuesta

26
  • A protected internal miembro es visible para cualquier código en el conjunto actual o en una clase derivada en otro conjunto. En palabras técnicas, es el logical disjunction de protected y internal.
  • Un miembro private solo es visible para codificar en la misma clase.

protected internal es en realidad el segundo modificador de acceso más permisivo después de public.


Vale la pena señalar que protected es posiblemente más permisiva queinternal, ya que permite el acceso de código que usted no tiene ningún control sobre (es decir, otros montajes). Mientras que internal permite el acceso desde al código en el ensamblado actual, este código es suyo y usted tiene el control sobre él.

Para parafrasear, los miembros protected (y protected internal) forman parte de la API pública de su conjunto (y, por lo tanto, deben documentarse). internal miembros no son.

+0

Entonces, ¿cuándo debo determinar el uso de 'protected internal' en lugar de' public'? – avirk

+0

@ François Su última frase no es verdadera en realidad; 'protected internal' es la ** unión ** de los dos, no la intersección. –

5

private es solamente visible para poseer miembros de la clase, mientras que protected internal es visible para las clases hijas así como a otras clases dentro de la colección de espacio de nombres.

+0

Así 'privado' es visible para' clases hijo así como para otras clases dentro de la colección de espacio de nombres'. – avirk

+0

@avirk No, eso es 'interno protegido'. 'private' es el modificador de acceso más estricto: solo está disponible para la clase de definición. –

3

privada

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

interna protegida

El tipo o miembro se puede acceder por cualquier código en el mismo conjunto, o por cualquier clase derivada en otro conjunto de

0

creo que protegida interno significa que solo las clases que heredan y están en el mismo ensamblado pueden ver esa propiedad. Aquellos que derivan la clase y son de diferente ensamblaje, no pueden verlo.

LE: lea Mattias Buelens comente esto.

+0

En realidad, esto es incorrecto. 'protected internal' significa' protected' * union * 'internal', por lo que ambas clases secundarias y otras clases en el mismo ensamblado pueden verlo. –

+0

@Mattias Buelens ... Mi inglés estaba un poco mal, pero lo que quería decir ahora está escrito. –

+0

Ok ... ahora veo. Lo tengo. –

0

Hablando en términos prácticos, normalmente solo uso privado para las variables para asegurarme de que no puedan ser utilizadas por otras clases.

Protegido interno, sin embargo, lo utilizaré a menudo para métodos que no deseo que la mayoría de las otras clases puedan usar, pero que deseo poder acceder para escribir casos de prueba. Es muy útil ya que permite la creación de clases de prueba en el espacio de nombres o la estructura del paquete, que luego puede acceder a esos métodos internos protegidos sin abrirlos de manera inapropiada al resto del mundo.

Este enfoque requiere un enfoque de codificación donde la escritura de código fácilmente "comprobable" es una prioridad. Si este no fuera mi enfoque, no estoy seguro de que encontraría muchas ocasiones para usar el interno protegido.

+1

La elección del modificador de acceso no debe estar determinada por su necesidad de pruebas. Si, por ejemplo, tiene una propiedad que no requiere un setter, no agregaría un setter público simplemente para permitir que se establezca para la prueba. Los marcos de prueba junto con marcos de burla pueden inyectarse en propiedades privadas, etc. Las pruebas influyen en su elección en los patrones o incluso en la abstracción, después de todo, es difícil probar la unidad de alguna manera si no se puede burlar de las dependencias. Sin embargo, las pruebas no deberían afectar la elección de los modificadores de acceso. – Nope

+0

+1 Francois, también veo a menudo personas que hacen de miembros privados 'internos', junto con el 'InternalsVisibleToAttribute' para exponerlos a un conjunto de prueba de unidad. – MattDavey

25

Un resumen gráfico (resumen en pocas palabras)

Visibility

+0

Debería haber otra columna llamada Clases derivadas en otro ensamblado: para la palabra clave interna protegida. –

+0

@Lyubomir Velchev: Es cierto que debe haber dos rubrices de todos modos (el mismo ensamblaje, diferente ensamblaje), y en este gráfico debe sombrearse el valor interno de "clase derivada". –

0

yo estaba tratando de entender las diferencias entre protegida interna e interna en el marco .NET mediante la lectura de la descripción proporcionada diferentes foros y blogs. Realmente no entendí, creé 2 ensamblajes separados usando VS2015. Probablemente ahora tengo una comprensión básica. Me gustaría compartir con ustedes, podría ser útil para alguien. Traté de usar los campos declarados en un ensamblaje de otro ensamblaje. También probé derivado de una clase que se declaró en otro ensamblado. Este es el código para class1.cs del conjunto 1

namespace Z_Dll_1 
{ 
    public class PublicBaseClassAssemblyOne 
    { 
     internal int _myinternal = 200; 
     protected internal int _protectedinternal = 100; 
     protected int _myProtected = 123; 
     private int _myPrivate = 2; 
     public int _myPublic = 45; 
    } 

    public class DerivedClassAssemblyOne : PublicBaseClassAssemblyOne 
    { 
     protected internal int intM = 10; 
    } 

    internal class MyInternalClass 
    { 
     public void MyMethod() 
     { 
      Console.WriteLine("Method one with internal class"); 
      PublicBaseClassAssemblyOne cl1 = new PublicBaseClassAssemblyOne(); 
      cl1._myinternal = 1000; //Internal type is available since it is in same assembly 
      cl1._protectedinternal = 10; // protected internal is available 
      cl1._myPublic = 2; // Public OK 
      //cl1.myPrivate = ?? // nor available since it is private 

      DerivedClassAssemblyOne drOne = new DerivedClassAssemblyOne(); 
      drOne._myinternal = 30; // Internal and available from derived class 
      drOne._myPublic = 1; // Public 
      drOne._protectedinternal = 2; // Able to be accessed from same assembly or derived class from other assembly 
     } 
    } 
} 

Aquí es código de otro montaje, Class2.cs utilizando Z_Dll_1;

namespace Z_Dll_2 
{ 
    public class ClassAssembly2 
    { 
     public ClassAssembly2() 
     { 
      PublicBaseClassAssemblyOne classfromOtherAssembly = new PublicBaseClassAssemblyOne(); 
      classfromOtherAssembly._myPublic = 0; //Only public is available 
     } 
    } 

    public class ClassDerivedFromOtherAssemblyClass : PublicBaseClassAssemblyOne 
    { 
     public ClassDerivedFromOtherAssemblyClass() 
     { 
     } 
     void ClassDerivedFromOtherAssemblyClassTestMethod() 
     { 
      //_myinternal = 200; // can't access since it was internal to other assembly 
      _protectedinternal = 100; // this can be accessed as it is derived class from other class that has protected internal 
      _myProtected = 123; // Ordinary protected data accessed from derived class 
      //_myPrivate = 2; //Private member can't be accessed from derived class 
      _myPublic = 45; // Public can be accessed anyway 

      //Try to create an instance of internal class 
      //MyInternalClass intClass = new MyInternalClass(); //Not accessible from this assembly 
     } 
    } 
} 
Cuestiones relacionadas