Pregunta

Me encoutered un poco (al menos para mí) un comportamiento extraño en una biblioteca que estoy construyendo;

Tengo este método:

public class Lib
{
 private string field = "field";

 public string Field
 {
  get
  {
   return field;
  }
 }

 public void Add(Lib lib)
 {
  string field = DoSomething(lib);
  Console.WriteLine(field);
 }

 protected string DoSomething(Lib lib)
 {
  return lib.field;
 }
}

Por lo tanto, si llamo el método de un programa que utiliza la biblioteca:

Lib lib = new Lib();
Lib lib2 = new Lib();

lib.Add(lib2);

La consola me da como salida "field" ... Ahora, yo no entiendo muy bien por qué sucede esto. Declaré el campo como privada, así que por qué puede uno acceder clase de propiedad privada y las otras clases no me da una excepción sobre el acceso-restricciones?!

A mi entender, un Lib puede acceder a sus propios campos de todos modos, pero cuando le doy el método de una instancia de otra Lib, no debería ser posible para la primera instancia para acceder a los campos privados segundos, porque ... bueno , porque es otro ejemplo y privado!

¿Fue útil?

Solución

Esto es por diseño, la private modificador de acceso limita el acceso al tipo que contiene. No es una instancia del tipo. Tipos anidados también tienen acceso a campos privados del tipo que contiene.

class MyType
{
    private string secret;

    public MyType(string secret) { this.secret = secret; }

    public void SomeMethod(MyType myType)
    {
        // Works because the private modifier pertains to the Type, not the instance
        Console.WriteLine(myType.secret); 
    }

    public class MyNestedType
    {
        public MyNestedType(MyType myType)
        {
            // Also works because the we are in a nested type of MyType
            Console.WriteLine(myType.secret); 
        }
    }
}

Los enlaces relevantes: niveles de accesibilidad , privada

Otros consejos

significa privada privada a la clase, no es el caso.

Me pareció que era extraño al principio a mí mismo, y pensé que había descubierto un "error" en .NET. ¡Estaba muy vuelve a poner en su lugar cuando publiqué esa teoría ...

"La consola me da 'campo' como salida ... Ahora, yo no acabo de entender por qué sucede esto. Declaré el campo como privada, así que por qué puede uno acceder clase propiedad privada las otras clases y no me da una excepción sobre el acceso-restricciones?! "

Pero la otra clase no está accediendo campo directamente ; es sólo acceder a un público método de la instancia de la clase Lib, que a su vez tiene acceso a la field miembro privado (lo cual se deja de hacer, ya que una clase puede tener acceso a sus propios miembros privados.

Es un poco como decir que no se puede entrar en mi casa y tomar mis cosas, porque eso es privado. Sin embargo, usted es muy libre de llamar a mi puerta y me piden que le dará mis cosas, porque eso es una forma pública de hacerlo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top