2011-03-09 84 views
4

我有以下代码:我的私人为什么可以访问?

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) 
    { 

    } 
} 

为什么_ personx哪怕是private访问?我能做些什么来“保护”_person?

+15

非常有趣的问题标题,如果你像我一样不成熟和幼稚。 – 2011-03-09 11:21:12

+0

彼得,我编辑了这个问题,所以没有更多有趣的笑话;) – 2011-03-09 11:57:45

+0

@彼得:我认为这将是有趣的!这是故意的,很高兴你喜欢它。 :) – Ian 2011-03-09 13:40:51

回答

3

这是因为你是从一个成员函数访问它。 如果您想阻止访问该特定功能,您可能需要将该静态功能移至新类。

+0

这就是我最终做的。 – Ian 2011-03-09 13:43:44

11

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

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

我认为,你同意我的观点的另一个实例的所有私有成员,这是确定的:

var p = this._person; 

但对于这一点:

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

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

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

这是没有意义的:-)

+0

基于类的实例的范围确实让人惊叹,Effel做到了。它只是失去了导致基于类的C#范围的C++思维模式。 – 2011-03-09 12:44:00

0

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

3

documentation

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

由于LoadFromFile位于声明_person的类中,因此它有权访问它。没有什么可以做的是,由于

私下接触是最 许可访问级别。

0

在C#(和java的,C++)的场的范围是基于类,所以所有的类的实例可以访问相同的类的其他实例的私有成员。

在像Eiffel(和Smalltalk)的场的范围的语言是基于实例,所以私有字段可以只能是由相同的实例访问。埃菲尔方法可能会更好,但C++赢得了大多数程序员的心灵和想法,因此很少有人提出“基于类的范围”问题。

+1

伊恩,你不能做一些私人的东西,即使是同一个班级也不能使用它,抱歉,但是知名度访问者**秘密**还没有发明出来,所以你可以使用**私人**,这意味着你可以从其他班级看不到和使用私人会员。 – 2011-03-09 11:21:01

相关问题