25

在使用 C# 时,我最近意识到我可以从的静态函数,甚至从其他对象调用Foo对象的私有函数。在我了解了访问修饰符的所有内容之后,这对我来说听起来很奇怪。FooFoo

据我所知,当函数执行某种内部流程的一部分时,您可以将其设为私有。只有对象本身知道何时使用这些功能,因为其他对象不应该/不能控制对象的流程。是否有任何理由将同一类的其他对象排除在这个非常简单的规则之外?

根据要求,举个例子:

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.
    }
}
4

6 回答 6

57

private修饰符强制执行封装原则

这个想法是“外部世界”不应该对 AClass 内部流程进行更改,因为 AClass 实现可能会随着时间而改变(你必须改变整个外部世界来修复实现中的差异——这几乎是不可能的)。

当 AClass 的实例访问其他 AClass 实例的内部时 - 您可以确定两个实例总是知道 AClass 的实现细节。如果 AClass 进程的内部逻辑发生了变化——你所要做的就是改变 AClass 的代码。

然而,在其他一些语言中,private可以在实例级别上工作,但在 C# 中并非如此。

于 2013-05-03T11:20:42.120 回答
17

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

例如,如果您有一个需要访问另一个实例的私有成员的 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;
    }
}
于 2013-05-03T08:52:24.367 回答
1

Private成员只能从该类范围内的所有其他成员访问。这是由多个实例还是一个实例完成都没有关系。

您试图限制成员只能被调用 from this.,因此不允许从外部调用它们(从实例的角度来看),但是一旦进入范围,就可以调用它们你的实例。这在 C# 中根本不可能。

不过会是一个不错的功能... :)

于 2013-05-03T08:49:58.070 回答
1

私有(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 #语言规范

于 2013-05-03T08:51:55.197 回答
0

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

所以基本上它...

Public - 如果你可以看到类,那么你可以看到方法

Private - 如果您是班级的一员,那么您可以看到该方法,否则不能。

于 2013-05-03T08:50:05.250 回答
0

private 意味着您只能从类本身访问它。不管是静态的还是静态的,都没有区别。虽然这条规则也不例外……

克里斯托夫

于 2013-05-03T08:45:06.780 回答