Подтвердить что ты не робот

Почему этот частный член доступен?

У меня есть этот класс:

class C
{
    private String msg;

    public void F(C obj, String arg)
    {
        obj.msg = arg; // this is strange, the msg shouldn't be accessible here.
    }

    public void Output()
    {
        Console.WriteLine(msg);
    }
}

Код проверки:

C obj1 = new C();
C obj2 = new C();
obj1.F(obj2, "from obj1");
obj2.Output();

Выход:

from obj1

Таким образом, пользовательский член obj2 получает доступ к другому объекту obj1. Я думаю, что это странно.

ADD

Вот полезная ссылка, упомянутая Хабибом:

Почему частные типы являются закрытыми для типа, а не экземпляра?

4b9b3361

Ответ 1

//это странно, msg не должен быть доступен здесь.

private члены доступны внутри класса, они недоступны вне класса.

Частный - MSDN

Частное ключевое слово - это модификатор доступа к членству. Частный доступ - это наименее разрешительный уровень доступа. Частные члены доступны только внутри тела класса или структуры, в которой они находятся объявлена ​​

По вашему другому вопросу:

Таким образом, пользовательский член obj2 получает доступ к другому объекту obj1. я подумайте, что это странно.

Вы передаете адрес obj2 в метод экземпляра obj1, а затем обращаетесь к obj2 частному члену msg в методе и изменяете его значение. Но поскольку оба они одного типа, создается впечатление, что вы обращаетесь к частному члену другого класса.

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

Рассмотрим, есть ли у вас другой класс, определяемый как:

class B
{
    public void SomeMethod(C obj, string arg)
    {
        obj.msg = arg; // that is an error. 
    }
}

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

Может существовать аргумент, согласно которому С# допускает instance.PrivateMember внутри класса, разработчики языка могли бы ограничить использование private до this.PrivateMember, так что частный член доступен только с текущим экземпляром. Если бы это было так, то ваш код повысил бы ошибку на obj.msg = arg;. По-видимому, дизайнеры С# выбрали доступ частного доступа к экземпляру вместо частного только для текущего экземпляра, поэтому основное правило заключается в том, что члены private доступны внутри класса, будь то с this (текущий экземпляр) или с экземпляром того же тип. Для более подробного обсуждения, почему это было сделано, вы можете увидеть этот вопрос

Ответ 2

Если я правильно понимаю конфиденциальность, это означает доступ только из одного класса, но не только из того же экземпляра этого класса.

Ответ 3

Частное означает, что к нему можно получить доступ из методов одного класса, а не к тому, что вы должны получить к нему доступ через this. Это может показаться странным, но это все тот же класс, хотя он отличается от переменной, а не this.

То же самое можно сделать с помощью статических методов.

Ответ 4

Модификатор private означает, что к нему можно получить доступ только в том же классе - не только в том же экземпляре.

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

Из С# Library