C# 为什么我的私处可以接近?

C# 为什么我的私处可以接近?,c#,.net,oop,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? retur

我有以下代码:

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

    }
}

为什么可以从
x
访问
person
,即使它是
private
?我能做些什么来“保护”\u person?

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

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

我假设,你同意我的观点,这是可以的:

var p = this._person;
但是这个呢:

public void DoSomething(PersonInitializer personInitializer)
{
    var p = personInitializer._person;
}
根据您的假设,此代码将根据输入有效。
例如:


这毫无意义:-)

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

专用变量的/引用只能在定义它们的类中访问。
因为在你的情况下,参考
Person\u Person
是在您访问它的同一类中定义的,它是可访问的。

来自:

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

由于
LoadFromFile
位于声明
\u person
的类的主体内,因此它可以访问该类。你对此无能为力,因为

私人访问最少 允许访问级别

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


在像(和Smalltalk)这样的语言中,字段的范围基于实例,因此私有字段只能由同一实例访问。埃菲尔方法可能更好,但C++赢得了大多数程序员的心意,因此很少有人质疑“基于类的范围”< P/P>非常有趣的问题标题,如果你像我一样幼稚和幼稚。彼得,我编辑了这个问题,所以没有更多有趣的笑话了。彼得:我以为会很有趣!这是有意的,很高兴你喜欢它。:)检查是否丢失编译器警告…基于类实例的作用域可能重复确实有意义,Effel会这样做。它只会丢失C++的思维模式,导致基于类的C类范围。伊恩,你不能把某些东西变得如此隐私以至于连同一个类都不能使用它,抱歉,但是还没有发明可见性访问器的秘密。所以你可以使用private,这意味着在其他类中你不能看到和使用private成员。这就是我最后要做的。
DoSomething(this); // ok
DoSomething(other); // not ok