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

时间:2011-03-09 11:16:47

标签: c# .net oop

我有以下代码:

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?

5 个答案:

答案 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)

来自documentation

  

私人会员只能访问   在班级或者班级内   声明它们的结构。

由于LoadFromFile位于声明_person的类的主体内,因此它可以访问它。因为

,你无能为力
  

私人访问是最少的   允许访问级别。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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