为什么有类级别的访问修饰符,而不是对象级?(Why have class-level access

2019-09-01 20:58发布

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

Answer 1:

当你做出一个成员私有的,它是私有的其它类不类本身。

如果你有等号这需要访问另一个实例的私有成员方法,它可以为实例非常有用:

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;
    }
}


Answer 2:

private修饰符强制封装的原则。

这个想法是,“外面的世界”不应该更改ACLASS内部流程,因为ACLASS实现可能会随时间而改变(你将不得不改变整个外部世界来解决执行中的差异 - 这是几乎不可能)。

当ACLASS的实例访问其他ACLASS实例的内部 - 你可以肯定的是这两种情况下随时了解执行ACLASS的细节。 如果内部ACLASS流程逻辑变成 - 所有你需要做的是改变ACLASS的代码。

在其他一些语言,但是, private的实例级别的作品,但是这并不是C#实现。



Answer 3:

Private成员只能从通俗易懂该类范围内的所有其他成员。 如果这是由多个实例或一个实例做没关系。

您正在试图restict成员仅从叫this. ,所以他们不允许从外部世界(从视图实例的角度看)调用,但他们被允许,一旦你进入你的实例的范围内调用。 这根本就不是在C#中可能的。

将是一个不错的功能,但... :)



Answer 4:

该私人(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#语言规范 。



Answer 5:

私人意味着你只能从类本身访问。 无论是静态或没有没什么区别。 尽管它是没有这个规则的例外......

克里斯托夫



Answer 6:

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

所以基本上它的...

公开 -如果你能看到的类,然后就可以看到该方法

私人 -如果你是类的一部分,那么你就可以看到该方法,否则不是。



文章来源: Why have class-level access modifiers instead of object-level?