为什么我的私人可以访问?

我有以下代码:

public class PersonInitializer { private Person _person; public static Person LoadFromFile(string path) { PersonInitializer x = new PersonInitializer(); Person p = x._person; //Why am I accessible? return x.LoadFromFile(); //Sure. } public Person LoadFromFile(string path) { } } 

为什么_ person可以从x访问,即使它是private ? 我该怎样做才能“保护”_person?

这是因为您从成员函数访问它。 如果要阻止对该特定函数的访问,可能需要将该静态函数移动到新类。

它是可访问的,因为你是它所定义的类!

访问修饰符适用于类,而不适用于类的实例。 这意味着,A类的实例可以访问另一个A类实例的所有私有成员。

我认为,你同意我的意见,这是可以的:

 var p = this._person; 

但是这个怎么样:

 public void DoSomething(PersonInitializer personInitializer) { var p = personInitializer._person; } 

根据您的假设,此代码将根据输入有效。
例:

 DoSomething(this); // ok DoSomething(other); // not ok 

这毫无意义:-)

从文档 :

私有成员只能在类的主体或声明它们的结构体中访问。

由于LoadFromFile位于声明_person的类的主体内,因此它可以访问它。 从那以后,你无能为力

私有访问是最不宽容的访问级别。

私有变量/引用只能在定义它们的类中访问。
既然在你的情况下,引用Person _person; 在您访问它的同一个类中定义,它是可访问的。

在C#(和Jave,C ++)中,字段的范围基于类,因此该类的所有实例都可以访问同一类其他实例的私有成员。

在像Eiffel (和Smalltalk)这样的语言中,字段的范围基于实例 ,因此私有字段只能由同一实例访问 。 Eiffel方法可能更好,但C ++赢得了大多数程序员的心,因此很少有人质疑“基于类的范围”