2011-10-11 8 views
5

Duplicar posibles:
Why are private fields private to the type, not the instance?¿Por qué es posible llamar a un método/variable de CSharp protegido o privado?

Considérese la clase siguiente:

public class Test 
{ 
    protected string name; 
    private DateTime dateTime; 

    public Test(string name) 
    { 
     this.name = name; 
     this.dateTime = DateTime.Now; 
    } 

    public Test(Test otherObject) 
    { 
     this.name = otherObject.name; 
     this.dateTime = otherObject.GetDateTime(); 
    } 

    private DateTime GetDateTime() 
    { 
     return dateTime; 
    } 

    public override string ToString() 
    { 
     return name + ":" + dateTime.Ticks.ToString(); 
    } 
} 

En mi constructor que estoy llamando privada o protegida cosas de la otherObject . ¿Por qué es esto posible? Siempre pensé que lo privado era realmente privado (lo que implicaba que solo el objeto podía llamar a ese método/variable) o protegido (solo accesible por sobrecargas).

¿Por qué y cuándo tendría que usar una característica como esta?

¿Hay alguna lógica OO/principio que me falta?

+1

¿Por qué obtuvieron un voto negativo? Parece una buena pregunta con un buen ejemplo de código (que admitiré que no he probado, pero supongo que hace lo que se afirma? – Chris

+0

también http://stackoverflow.com/questions/4244818/why-can-private-member- variable-be-changed-by-class-instance – AakashM

+0

y http://stackoverflow.com/questions/2090285/c-private-members-visibility – AakashM

Respuesta

5

De MSDN (Referencia de C#)

La palabra clave privada es un modificador de acceso miembro. El acceso privado es el nivel de acceso menos permisivo. Los miembros privados son accesibles solo dentro del cuerpo de la clase o la estructura en la que están declarados.

1

Los modificadores de acceso están determinados por clase, no por objeto. Si va a acceder a TestObject desde métodos de alguna otra clase, lo mismo sería imposible.

Ejemplo trivial para el uso de eso es el método Clone(), donde tiene que acceder a otras partes privadas de objetos para crear una copia.

1

Privado significa que solo se puede acceder por código en la misma clase. Ese es el caso aquí. Tienes otra instancia, pero es la misma clase.

2

Esto se comporta exactamente según la especificación C#. (Es también la manera de Java determina la accesibilidad.)

acceso se aplica por el tipo de expresar que está accediendo, no el identidad del objeto al que está accediendo.

En cuanto a cuándo es útil: comparar dos objetos del mismo tipo, clonar, etc. Es útil no tener que exponer públicamente todos sus datos cuando "confía" en el código de la misma clase.

2

Es privado para otras clases, no para instancias de objetos y, como usted pertenece a la misma clase, puede acceder a sus métodos privados.

Se puede utilizar para la clonación de objetos, por ejemplo,

3

Para responder a su pregunta:

Puede usar que, por ejemplo, en un método de clonación. Donde necesita acceso de escritura a los miembros que pueden estar expuestos como de solo lectura.Como

class MyClass : ICloneable 
{ 
    public object Clone() 
    { 
     var clone = (MyClass)MemberwiseClone(); 
     clone.Value = this.Value; // without the way private works, this would not be possible 
     return clone; 
    } 

    public int Value{ get; private set;} 
} 
+0

Sí, ¡eso tendría sentido! –

Cuestiones relacionadas