我的私人为什么可以访问?
我有以下代码:我的私人为什么可以访问?
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
这是没有意义的:-)
基于类的实例的范围确实让人惊叹,Effel做到了。它只是失去了导致基于类的C#范围的C++思维模式。 – 2011-03-09 12:44:00
私有变量的/引用只能在它们被定义的类中访问。
因为在你的情况下,参考Person _person;
被定义在你访问它的同一个类中,它是可访问的。
私有成员只能 内部类的主体或 结构中声明它们进行访问。
由于LoadFromFile
位于声明_person
的类中,因此它有权访问它。没有什么可以做的是,由于
私下接触是最 许可访问级别。
在C#(和java的,C++)的场的范围是基于类,所以所有的类的实例可以访问相同的类的其他实例的私有成员。
在像Eiffel(和Smalltalk)的场的范围的语言是基于实例,所以私有字段可以只能是由相同的实例访问。埃菲尔方法可能会更好,但C++赢得了大多数程序员的心灵和想法,因此很少有人提出“基于类的范围”问题。
伊恩,你不能做一些私人的东西,即使是同一个班级也不能使用它,抱歉,但是知名度访问者**秘密**还没有发明出来,所以你可以使用**私人**,这意味着你可以从其他班级看不到和使用私人会员。 – 2011-03-09 11:21:01
非常有趣的问题标题,如果你像我一样不成熟和幼稚。 – 2011-03-09 11:21:12
彼得,我编辑了这个问题,所以没有更多有趣的笑话;) – 2011-03-09 11:57:45
@彼得:我认为这将是有趣的!这是故意的,很高兴你喜欢它。 :) – Ian 2011-03-09 13:40:51