我有以下代码:
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?
答案 0 :(得分:11)
它是可访问的,因为你是它所定义的类!
访问修饰符适用于类,而不适用于类的实例。这意味着,A类的实例可以访问另一个A类实例的所有私有成员。
我认为,你同意我的观点,这是可以的:
var p = this._person;
但是这个怎么样:
public void DoSomething(PersonInitializer personInitializer)
{
var p = personInitializer._person;
}
根据您的假设,此代码根据输入有效 例如:
DoSomething(this); // ok
DoSomething(other); // not ok
这没有意义: - )
答案 1 :(得分:3)
这是因为您是从成员函数访问它。 如果要阻止对该特定函数的访问,可能需要将该静态函数移动到新类。
答案 2 :(得分:3)
私人会员只能访问 在班级或者班级内 声明它们的结构。
由于LoadFromFile
位于声明_person
的类的主体内,因此它可以访问它。因为
私人访问是最少的 允许访问级别。
答案 3 :(得分:0)
私有变量/引用只能在定义它们的类中访问
因为在您的情况下,引用Person _person;
在您访问它的同一个类中定义,所以它是可访问的。
答案 4 :(得分:0)
在C#(和Jave,C ++)中,字段的范围基于类,因此类的所有实例都可以访问同一类的其他实例的私有成员< /强>
在Eiffel(和Smalltalk)等语言中,字段的范围基于实例,因此私有字段只能由同一个实例访问。 Eiffel方法可能更好,但C ++赢得了大多数程序员的心,因此很少有人质疑“基于类的范围”