2009-10-27 17 views
12

¿Cómo se puede compilar este código? El siguiente código en el operador int PUEDE acceder a una variable privada de la clase MyValue? ¿Por qué?¿Accediendo a un miembro privado de un parámetro dentro de un método estático?

class Program 
{ 
    static void Main(string[] args) 
    { 
     Myvalue my = new Myvalue(100); 
     Console.WriteLine(my + 100); 
     Console.Read(); 
    } 
} 


public class Myvalue 
{ 
    private int _myvalue; 

    public Myvalue(int value) 
    { 
     _myvalue = value; 
    } 

    public static implicit operator int(Myvalue v) 
    { 
     return v._myvalue; 
    } 
} 

Respuesta

18

Porque es de la clase, tiene acceso a variables privadas en ella. Al igual que los métodos públicos de su instancia. Funciona de la manera opuesta también. Puede acceder a miembros estáticos privados desde los miembros de la instancia para crear un patrón Monostate.

+0

Si la clase hubiera sido estática, lo hubiera entendido. Pero dado que el objeto se pasa por parámetro, ¿por qué no requiere tener acceso? –

+3

@Daok: Porque su método estático es miembro de la clase. Si ese método estático estuviera en otro lugar, no estaría permitido. –

+0

Bien, gracias por la precisión. –

5

int operador() sigue siendo una función miembro de la clase MyValue y así se puede acceder a todos los campos de los objetos de tipo MyValue.

Tenga en cuenta que la estática sólo significa que un objeto MyValue necesita ser pasado a la función como un parámetro.

14

El private medios privados para la clase y no privadas para la instancia.

+2

+1 - ¡Bien dicho, preciso y concienzudo! – Nate

+1

1 de hecho: http://stackoverflow.com/questions/888224/what-is-your-longest-held-programming-assumption-that-turned-out-to-be-incorrect/888246#888246 –

+1

Hum, no privado para la instancia? Creo que está mal porque no puedo usar: Myvalue my = new Myvalue (100); my._Myvalue = 1; Porque la instancia "mi" no puede acceder a la variable privada. –

Cuestiones relacionadas