为什么要使用类级访问修饰符而不是对象级?

在使用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. } } 

当你将一个成员设为私有时,它对其他类是私有的而不是类本身。

例如,如果您有一个需要访问另一个实例的私有成员的Equals方法,它会很有用:

 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修饰符强制执行Encapsulation原则。

我们的想法是“外部世界”不应该对AClass内部流程进行更改,因为AClass实现可能会随着时间的推移而发生变化(并且您必须更改整个外部世界以修复实现中的差异 – 这几乎是不可能的)。

当AClass的实例访问其他AClass实例的内部时 – 您可以确保两个实例始终知道AClass的实现细节。 如果改变了AClass进程内部的逻辑 – 你所要做的就是改变AClass的代码。

但是,在其他一些语言中, private在实例级别上工作,但在C#中却不是这样。

Private成员只能访问该类范围内的所有其他成员。 如果这是由多个实例或一个实例完成的,则无关紧要。

你试图重新定位成员只能从this.调用this. ,因此不允许从外部世界调用它们(从实例的角度来看),但是一旦进入实例的范围,就可以调用它们。 这在C#中是不可能的。

虽然是一个很好的function…… 🙂

私有(C#参考)主题说:

private关键字是成员访问修饰符。 私有访问是最不宽容的访问级别。 私有成员只能在类的主体或声明它们的结构中访问(…)

更:

同一主体中的嵌套类型也可以访问这些私有成员。

所以下面的代码将完美地工作。

 class Foo { private void PrivateMethod() { } class FooBaby { public static void MethodB() { Foo foo = new Foo(); foo.PrivateMethod(); } } } 

关于“为什么”类具有访问修饰符而不是对象的问题,它是将信息隐藏在OOP中的方法之一(阅读有关封装(面向对象编程)的更多信息) 。

我还建议你阅读这些章节:

  • 10.5会员访问权限
  • 17.2.3访问修饰符

标准ECMA-334 C#语言规范 。

private表示您只能从类本身访问它。 它是否静态没有区别。 虽然这个规则也不例外……

克里斯托夫

那么你可以访问私有方法的原因是因为你在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 } } 

所以基本上……

公共 – 如果您可以看到该类,那么您可以看到该方法

私人 – 如果您是class级的一员,那么您可以看到该方法,否则不会。