Хобрук: Ваш путь к мастерству в программировании

Почему мои приватные доступны?

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

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?

09.03.2011

  • очень забавный заголовок вопроса, если вы такой незрелый и инфантильный, как я. 09.03.2011
  • Питер, я отредактировал вопрос, чтобы больше не было смешных шуток по этому поводу ;) 09.03.2011
  • @Peter: Я думал, это будет забавно! Это намеренно, рад, что вам понравилось. :) 09.03.2011
  • Проверьте наличие предупреждения компилятора MissingTrousers... 09.03.2011
  • возможный дубликат Почему частные поля являются частными для тип, а не экземпляр? 23.07.2014

Ответы:


1

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

09.03.2011
  • Это то, что я в итоге сделал. 09.03.2011

  • 2

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

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

    Я предполагаю, вы согласны со мной, что это нормально:

    var p = this._person;
    

    Но как насчет этого:

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

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

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

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

    09.03.2011
  • Область действия, основанная на экземплярах класса, имеет смысл, Effel делает это. Это просто проиграло мышлению С++, которое привело к охвату С# на основе классов. 09.03.2011

  • 3

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

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

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

    Частный доступ — это наименее разрешительный уровень доступа.

    09.03.2011

    4

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

    09.03.2011

    5

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

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

    09.03.2011
  • Ян, вы не можете сделать что-то настолько приватным, что его не сможет использовать даже тот же класс, извините, но метод доступа к видимости secret еще не был изобретен, поэтому вы можете использовать private и это означает, что из других классов вы не можете видеть и использовать закрытые члены. 09.03.2011
  • Новые материалы

    Что такое структура данных?
    Структура данных хранит и извлекает данные. Все, что обеспечивает эти две функции, является структурой данных . Период. Вы можете пропустить оставшуюся часть статьи, если ответ..

    мои январские чтения по программированию
    Эрик Эллиот Программирование приложения JavaScript Эл Свейгарт «Автоматизируйте скучные вещи с помощью Python» Прогрессивное веб-приложение Google..

    Создание ассоциаций секвелизации с помощью инструмента командной строки Sequelize
    Sequelize - популярный, простой в использовании инструмент объектно-реляционного сопоставления (ORM) JavaScript, который работает с базами данных SQL. Довольно просто начать новый проект с..

    Искусственный интеллект в юридической отрасли - пример прогнозирования судебных решений с помощью глубокого обучения
    На протяжении всей истории люди полагались на суды, присяжных, королей и королев в отправлении правосудия. Сегодня способность судов обеспечивать справедливое и быстрое правосудие для своих..

    Введение в машинное обучение для обнаружения аномалий (часть 1)
    Тщательно созданный, тщательно спроектированный ресурс для специалистов по данным. Часть 1 Главы 03 из Руководства по машинному обучению для обнаружения аномалий Внимание! Прежде чем вы..

    Начало работы с Pulumi в Digital Ocean
    Цифровой океан (ДО) — отличная альтернатива многим другим поставщикам облачных услуг. DO предоставляет простой и понятный пользовательский интерфейс, упрощающий управление инфраструктурой и..

    #Day68 из #100days_of_coding
    Вчера был мой 68-й день кодинга. я решил один вопрос Проблема: Разбить двоичную строку на подстроки с равным количеством нулей и единиц Дана двоичная строка str длины N . Задача состоит..