Разница между публичными и приватными переменными - PullRequest
2 голосов
/ 14 декабря 2010
namespace hi
{
    class hithere
    {
         public int numberOne = 12;
         private int numberTwo = 12;

         static void yo()
         {
         }
    }
}

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

Ответы [ 8 ]

5 голосов
/ 14 декабря 2010

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

public Доступ не ограничен.

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

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

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

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

2 голосов
/ 14 декабря 2010

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

Так что я могу сделать Your_Object.numberOne = 14;, но я не могу сделать Your_Object.numberTwo= 14;

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

Переменные в C #
Отражение в C #
Accessors в C #

1 голос
/ 14 декабря 2010

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

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);
    }
}
1 голос
/ 14 декабря 2010

В простейших терминах 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.

0 голосов
/ 14 декабря 2010

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

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

Второй ошибка, но первый - ОК.

0 голосов
/ 14 декабря 2010

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

0 голосов
/ 14 декабря 2010

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

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

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

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

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

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

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

Обратите внимание, что предложение "непосредственно через код" здесь очень важно; к ним можно получить доступ, используя отражение.

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

0 голосов
/ 14 декабря 2010

в общем, PUBLIC означает, что любой другой код вне класса может изменить его значение. ЧАСТНЫЕ могут быть использованы / изменены только в самом классе. Кроме того, если вы создаете классы, производные от другого, и хотите, чтобы класс дочернего уровня мог использовать / изменять значения своего родителя, но не другого универсального кода вне класса, используйте PROTECTED.

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