мы можем получить доступ к закрытой переменной, используя объект - PullRequest
4 голосов
/ 08 марта 2011

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

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'. Но внутри класса это разрешено, вне класса не разрешено. Кто-нибудь может сказать мне причину этого ??

Ответы [ 7 ]

4 голосов
/ 08 марта 2011

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

class Program
{
    private int i;

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

}

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

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
    }
}

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

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

почему ??

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

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

§3.5.1 Заявленная доступность

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

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

§10.2.6.2 Заявленная доступность

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

2 голосов
/ 08 марта 2011

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

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

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

0 голосов
/ 26 октября 2015

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

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();    
        }          
    }    
}
0 голосов
/ 08 марта 2011

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

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

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

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

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

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

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