Ответ 1
//это странно, msg не должен быть доступен здесь.
private
члены доступны внутри класса, они недоступны вне класса.
Частное ключевое слово - это модификатор доступа к членству. Частный доступ - это наименее разрешительный уровень доступа. Частные члены доступны только внутри тела класса или структуры, в которой они находятся объявлена
По вашему другому вопросу:
Таким образом, пользовательский член 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
(текущий экземпляр) или с экземпляром того же тип. Для более подробного обсуждения, почему это было сделано, вы можете увидеть этот вопрос