Мы можем получить доступ к частной переменной, используя объект

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

class Program
{
    private int i;

    public void method1()
    {            
        Program p = new Program();
        p.i = 5;        // OK when accessed within the class
    }

}

class AnotherClass
{

    void method2()
    {
        Program p = new Program();
        p.i = 5; //error because private variables cannot be accessed with an object which is created out side the class
    }

}

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

В обоих случаях выше мы получаем доступ к частной переменной "i" через объект "p". Но внутри класса разрешено, вне класса не допускается. Может ли кто-нибудь сказать мне причину этого?

Ответ 1

Вы можете получить доступ к я из класса, потому что доступ к частным членам может получить только члены класса. В этом случае это выглядит странно, потому что p - это другой объект, чем объект, который обращается к переменной, но его все тот же класс и ограничение находятся на уровне класса, а не на уровне объекта.

class Program
{
    private int i;

    public void method1()
    {            
        Program p = new Program();
        p.i = 5;        // OK when accessed within the class
    }

}

Вы не можете получить доступ к я из другого класса (если это не внутренний класс, а другой). Это полностью соответствует ожиданиям.

class AnotherClass
{
    void method2()
    {
        Program p = new Program();
        p.i = 5; //error because private variables cannot be accessed with an object which is created out side the class
    }
}

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

Ответ 2

почему??

Это соответствует спецификации языка. Модификатор доступа private имеет семантику, которой разрешено только объявление class или struct объявить член.

Я предлагаю прочитать спецификацию для деталей. В частности, проверьте

§3.5.1 Объявленная доступность

§3.5.4 Ограничения доступности

§10.2.3 Модификаторы доступа

§10.2.6.2 Объявленная доступность

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

Ответ 3

В обоих случаях выше мы получаем доступ к частной переменной "i" через объект "p". Но внутри класса разрешено, вне класса не допускается. Может ли кто-нибудь сказать мне причину этого?

Поскольку модификаторы доступа не относятся к объекту, они относятся к классу (или > , для модификатора internal).

Даже если вы обращаетесь к нему из другого объекта или статического контекста, пока вы остаетесь в одном классе, доступ к члену private будет работать. Это личное для класса, а не его экземпляры.

Ответ 4

Возможно, вы запутались в объекте и классе, public/private/protected/internal влияют на видимость класса, а не на видимость объекта. Это означает, что объект класса может обращаться к атрибутам другого объекта того же класса, даже если они являются частными.

Я не уверен, что правильно понял ваш вопрос...

Ответ 5

если доступ за пределами класса является необходимым параметром, а затем попробуйте свойства.

Ответ 6

Это относится к OOP. Ответ был бы потому, что его частный, иначе, если бы все частные переменные были доступны извне класса, концепция объекта не имела бы никакого смысла.

Ответ 7

Вы также можете получить доступ к приватным переменным в следующем процессе...

namespace OOPSProj
{    
    class Program
    {    
        private int i;    
        public void Methode1()
        {
            Program objprog2 = new Program();
            objprog2.i = 15;
            Console.WriteLine("i= " + objprog2.i);
        }    
        static void Main(string[] args)
        {
            Program objprog = new Program();
            objprog.i = 10;
            Console.WriteLine("i= " + objprog.i);
            objprog.Methode1();                
        }
    }    
    class Test
    {
        static void Main()
        {
            Program objproj3 = new Program();
            objproj3.Methode1();    
        }          
    }    
}