虽然使用C#,最近我意识到,我可以调用Foo
从对象的私有函数Foo
静态功能,甚至可以从其他的Foo
对象。 一切后,我已经了解了访问修饰符,这听起来很奇怪,我。
据我所知,你犯了一个私人的功能,当它做一些事情,是某种内在过程的一部分。 只有对象本身知道何时使用这些功能,因为其他的对象不应当/不能控制对象的流动。 没有任何理由,为什么同一类的其他对象应该从这个非常简单的规则可以例外?
按照请求,例如:
public class AClass {
private void doSomething() { /* Do something here */ }
public void aFunction() {
AClass f = new AClass();
f.doSomething(); // I would have expected this line to cause an access error.
}
}
当你做出一个成员私有的,它是私有的其它类不类本身。
如果你有等号这需要访问另一个实例的私有成员方法,它可以为实例非常有用:
public class AClass
{
private int privateMemberA;
// This version of Equals has been simplified
// for the purpose of exemplifying my point, it shouldn't be copied as is
public override bool Equals(object obj)
{
var otherInstance = obj as AClass;
if (otherInstance == null)
{
return null;
}
return otherInstance.privateMemberA == this.privateMemberA;
}
}
该private
修饰符强制封装的原则。
这个想法是,“外面的世界”不应该更改ACLASS内部流程,因为ACLASS实现可能会随时间而改变(你将不得不改变整个外部世界来解决执行中的差异 - 这是几乎不可能)。
当ACLASS的实例访问其他ACLASS实例的内部 - 你可以肯定的是这两种情况下随时了解执行ACLASS的细节。 如果内部ACLASS流程逻辑变成 - 所有你需要做的是改变ACLASS的代码。
在其他一些语言,但是, private
的实例级别的作品,但是这并不是C#实现。
Private
成员只能从通俗易懂该类范围内的所有其他成员。 如果这是由多个实例或一个实例做没关系。
您正在试图restict成员仅从叫this.
,所以他们不允许从外部世界(从视图实例的角度看)调用,但他们被允许,一旦你进入你的实例的范围内调用。 这根本就不是在C#中可能的。
将是一个不错的功能,但... :)
该私人(C#参考)话题说:
private关键字是一个成员访问修饰符。 私接是最宽容的访问级别。 私有成员都可以访问只在类的主体或声明它们的结构(...)
更:
嵌套类型在同一个身体还可以访问这些私有成员。
所以,下面的代码将很好地工作。
class Foo
{
private void PrivateMethod()
{
}
class FooBaby
{
public static void MethodB()
{
Foo foo = new Foo();
foo.PrivateMethod();
}
}
}
关于这个问题:“为什么”类有访问修饰符,而不是对象,它是通过这些信息隐藏在OOP(阅读更多有关的一种方式封装(面向对象编程) 。
我还建议你去通过章节:
的标准ECMA-334 C#语言规范 。
私人意味着你只能从类本身访问。 无论是静态或没有没什么区别。 尽管它是没有这个规则的例外......
克里斯托夫
那么你可以访问私有方法的原因是因为你里面AClass
例如,如果你创建一个BClass
并创建一个AClass
里面,你会无法访问私有方法
public class AClass
{
private void doSomething() { /* Do something here */ }
public void aFunction()
{
AClass f = new AClass();
f.doSomething(); // we are inside AClass so we can access
}
}
public class BClass
{
private void doSomething() { /* Do something here */ }
public void aFunction()
{
AClass f = new AClass();
f.doSomething(); // Will not compile because we are outside AClass
}
}
所以基本上它的...
公开 -如果你能看到的类,然后就可以看到该方法
私人 -如果你是类的一部分,那么你就可以看到该方法,否则不是。