Question

J'encoutered un peu (au moins pour moi) un comportement étrange dans une bibliothèque que je construis;

J'ai cette méthode:

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;
 }
}

Alors, si je l'appelle la méthode à partir d'un programme qui utilise la bibliothèque:

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

lib.Add(lib2);

La console me donne "field" en sortie ... Maintenant, je ne comprends pas pourquoi cela se produit. Je déclarais le terrain privé, alors pourquoi peut-on accès classe propriété privée des autres classes et il ne me donne pas une exception sur l'accès-restrictions?

Dans ma compréhension, un Lib peut accéder à ses propres champs de toute façon, mais quand je donne la méthode d'une autre instance de Lib, il ne devrait pas être possible pour la première instance pour accéder à des champs privés des secondes, parce que ... eh bien , parce que c'est une autre instance et privé!

Était-ce utile?

La solution

est par la conception, l'accès private Modificateur limite l'accès au type contenant. Pas une instance du type. Types emboîtés ont également accès à des champs privés du type contenant.

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); 
        }
    }
}

Les liens pertinents: niveaux d'accessibilité , privé

Autres conseils

privé signifie privé à la classe, et non pas l'instance.

Je pensais que cela était étrange au premier abord moi-même, et pensait que je l'avais découvert un « bug » dans .NET. Le garçon était que je mets en place quand je sorti cette théorie ...

"La console me donne « champ » en sortie ... Maintenant, je ne comprends pas pourquoi cela arrive. Je déclarais le terrain privé, alors pourquoi peut-on accès classe propriété privée les autres classes et il ne me donne pas une exception sur l'accès-restrictions?! "

Mais l'autre classe n'accède pas à champ directement ; il est tout simplement accéder à une publique méthode de l'instance de la classe Lib, qui à son tour donne accès au député field (ce qui est autorisé à le faire, car une classe peut accéder à ses propres députés.

Il est un peu comme dire que vous ne pouvez pas entrer dans ma maison et prendre mes affaires, parce que c'est privé. Cependant, vous êtes très libre de frapper à ma porte et me demander de vous donner mes affaires, parce que c'est une façon publique de le faire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top