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

Разница между общедоступными и приватными переменными

namespace hi
{
    class hithere
    {
         public int numberOne = 12;
         private int numberTwo = 12;

         static void yo()
         {
         }
    }
}

Может ли кто-нибудь сказать мне разницу между переменными numberOne и numberTwo в этом фрагменте кода?

14.12.2010


Ответы:


1

Публичные переменные доступны из внешних классов, а частные доступны только для текущего класса и внутренних классов:

public class VarClass
{
    public int publicID = 10;
    private int privateID = 100;
    public VarClass()
    {
        Console.WriteLine(publicID);
        Console.WriteLine(privateID);
    }

    public class InnerClass
    {
        public InnerClass()
        {
            VarClass c = new VarClass();
            Console.WriteLine(c.privateID);
            Console.WriteLine(c.publicID);
        }
    }
}

public class OuterClass
{
    public OuterClass()
    {
        VarClass c = new VarClass();
        Console.WriteLine(c.privateID); // Compile Error
        Console.WriteLine(c.publicID);
    }
}
14.12.2010

2

Из уровней доступности на MSDN:

общедоступный доступ не ограничен.

защищено Доступ ограничен содержащим классом или типами, производными от содержащего класса.

внутренний доступ ограничен текущей сборкой.

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

private Доступ ограничен содержащим типом.

14.12.2010

3

Другие объекты могут получить доступ к NumberOne, но не могут получить доступ к NumberTwo.

То есть я могу Your_Object.numberOne = 14;, но не могу Your_Object.numberTwo= 14;

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

Переменные в C#
Отражение в C#
Аксессоры в C#

14.12.2010

4

Проще говоря, пометка numberOne как общедоступная означает, что если вы создадите экземпляр своего класса hithere, эта переменная-член будет доступна. Например:

hithere h = new hithere()
h.numberOne = 42;

numberTwo закрытый означает, что он недоступен и может использоваться только в классе hithere. Итак, продолжим приведенный выше пример:

hithere h = new hithere()
h.numberOne = 42;
h.numberTwo = 84;

Последняя строка вызовет ошибку компилятора, поскольку вы не можете получить доступ к numberTwo, так как он является закрытым.

Вероятно, стоит потратить некоторое время на чтение модификаторов доступа, быстрый google найдет много примеров, например:

http://www.devsource.com/c/a/Techniques/Understanding-C-Class-and-Member-Modifiers/ http://msdn.microsoft.com/en-us/library/ba0a1yw2%28v=vs.80%29.aspx

Кроме того, ваш класс hithere не имеет определенного модификатора доступа, поэтому компилятор предполагает, что это частный. Таким образом, если бы вы ссылались на свою библиотеку из другой, вы не смогли бы создавать экземпляры класса hithere.

14.12.2010

5

в общем, PUBLIC означает, что любой другой код вне класса может изменить его значение. PRIVATE могут использоваться/изменяться только В самом классе. Кроме того, если вы создаете классы, производные от другого, и хотите, чтобы класс дочернего уровня мог использовать/изменять значения своего родителя, но не другого универсального кода вне класса, используйте PROTECTED.

14.12.2010

6

Найдите «Инкапсуляция». Есть так много простых материалов для изучения.

14.12.2010

7

public и private — это модификаторы доступа для членов. Это относится к тому, кто может получить доступ к членам напрямую через код. public означает, что доступ не ограничен, поэтому любой может получить доступ к члену напрямую через код. private означает, что доступ ограничен только содержащим классом. Таким образом, каждый может получить доступ к numberOne напрямую через код, но только содержащий класс может получить доступ к numberTwo напрямую через код.

Всего существует пять модификаторов доступа:

public: доступ не ограничен

protected: доступ ограничен содержащим классом или классами, производными от содержащего класса

internal: доступ ограничен содержащей сборкой

protected internal: это ИЛИ protected и internal, так что доступ ограничен содержащим классом или классами, производными от содержащего класса ИЛИ содержащей сборки

private: доступ ограничен содержащим классом

Обратите внимание, что пункт «непосредственно через код» здесь имеет решающее значение; можно получить доступ к этим членам с помощью отражения.

Соответствующим разделом спецификации C# является §3.5, особенно §3.5.2.

14.12.2010
  • private: access is limited to the defining class Нет, также внутренний класс 14.12.2010
  • @Saeed: это внутри определяющего класса. 14.12.2010
  • Лучше сказать containing type как MSDN, потому что это не определитель переменной. 14.12.2010

  • 8

    Это означает, что если у вас есть другой класс, подобный этому:

    namespace hi
    {
        class hithere2
        {
             static void yo2()
             {
                 hithere h = new hithere();
                 h.numberOne = 2;
                 h.numberTwo = 3;
             }
        }
    }
    

    Со вторым ошибка, а с первым все в порядке.

    14.12.2010
    Новые материалы

    Как симулировать серию пенальти на Python с помощью симуляции Монте-Карло, часть 1: генерация функций
    Серия пенальти была огромным испытанием во время чемпионата мира по футболу. Они вызвали много споров в социальных сетях и новостных агентствах. Даже финальный матч турнира решался по..

    AST для разработчиков JavaScript
    TL; DR Эта статья - мое выступление на недавно состоявшейся конференции Stockholm ReactJS Meetup. Вы можете посмотреть слайды здесь..

    5 проектов на Python, которые нужно создать прямо сейчас!
    Добро пожаловать! Python — один из моих любимых языков программирования. Если вы новичок в этом языке, перейдите по ссылке ниже, чтобы узнать о нем больше:

    Dall-E 2: недавние исследования показывают недостатки в искусстве, созданном искусственным интеллектом
    DALL-E 2 — это всеобщее внимание в индустрии искусственного интеллекта. Люди в списке ожидания пытаются заполучить продукт. Что это означает для развития креативной индустрии? О применении ИИ в..

    «Очень простой» эволюционный подход к обучению с подкреплением
    В прошлом семестре я посетил лекцию по обучению с подкреплением (RL) в моем университете. Честно говоря, я присоединился к нему официально, но я редко ходил на лекции, потому что в целом я нахожу..

    Освоение информационного поиска: создание интеллектуальных поисковых систем (глава 1)
    Глава 1. Поиск по ключевым словам: основы информационного поиска Справочная глава: «Оценка моделей поиска информации: подробное руководство по показателям производительности » Глава 1: «Поиск..

    Фишинг — Упаковано и зашифровано
    Будучи старшим ИТ-специалистом в небольшой фирме, я могу делать много разных вещей. Одна из этих вещей: специалист по кибербезопасности. Мне нравится это делать, потому что в настоящее время я..