Почему мои рядовые доступны? - PullRequest
4 голосов
/ 09 марта 2011

У меня есть следующий код:

public class PersonInitializer
{
    private Person _person;

    public static Person LoadFromFile(string path)
    {
        PersonInitializer x = new PersonInitializer();

        Person p = x._person; //Why am I accessible?

        return x.LoadFromFile(); //Sure.

    }

    public Person LoadFromFile(string path)
    {

    }
}

Почему _ person доступно с x, даже если оно private? Что я могу сделать, чтобы "защитить" _person?

Ответы [ 5 ]

11 голосов
/ 09 марта 2011

Он доступен, потому что вы тот класс, в котором он определен!

Модификаторы доступа применяются к классам, а не к экземплярам класса. Это означает, что экземпляр класса A имеет доступ ко всем закрытым членам другого экземпляра класса A.

Полагаю, вы согласны со мной, что это нормально:

var p = this._person;

А как же это:

public void DoSomething(PersonInitializer personInitializer)
{
    var p = personInitializer._person;
}

Согласно вашему предположению, этот код будет действительным в зависимости от ввода.
Пример:

DoSomething(this); // ok
DoSomething(other); // not ok

Это не имеет смысла: -)

3 голосов
/ 09 марта 2011

Из документации :

Закрытые члены доступны только внутри тела класса или структуры, в которой они объявлены.

Поскольку LoadFromFile находится в теле класса, в котором объявлен _person, он имеет к нему доступ.С этим ничего не поделаешь, поскольку

Частный доступ является наименее разрешающим уровнем доступа.

3 голосов
/ 09 марта 2011

Это потому, что вы обращаетесь к нему из функции-члена.Если вы хотите запретить доступ к этой конкретной функции, вы можете переместить эту статическую функцию в новый класс.

0 голосов
/ 09 марта 2011

В C # (и Jave, C ++) область действия поля основана на классе, поэтому все экземпляры класса могут обращаться к закрытым членам других экземпляров того же класса *к тому же экземпляру .Метод Eiffel может быть лучше, но C ++ покорил сердца и умы большинства программистов, поэтому очень немногие задаются вопросом «сфера действия на основе классов»

0 голосов
/ 09 марта 2011

Закрытые переменные / ссылки доступны только в том классе, в котором они определены.
Поскольку в вашем случае ссылка Person _person; определена в том же классе, откуда вы к ней обращаетесь, она доступна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...