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