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

C# 为什么使用类级访问修饰符而不是对象级?,c#,class,object,access-modifiers,C#,Class,Object,Access Modifiers,在使用C#时,我最近意识到我可以从Foo的静态函数,甚至从其他Foo对象调用Foo对象的私有函数。在我学习了访问修饰符之后,这听起来很奇怪 据我所知,当函数执行某种内部过程的某项操作时,会将其设置为私有函数。只有对象本身知道何时使用这些函数,因为其他对象不应该/不能控制对象的流。是否有任何理由可以将同一类的其他对象排除在这条非常简单的规则之外 根据要求,举例如下: public class AClass { private void doSomething() { /* Do somet

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

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


Christoph

Private
成员只能从该类范围内的所有其他成员访问。这是由多个实例还是由一个实例完成并不重要

您正试图将成员重新设置为仅从
此调用。
,因此不允许从外部世界调用它们(从实例的角度来看),但允许在您进入实例的范围后调用它们。这在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
    }
}
所以基本上是

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

Private-如果您是该类的一员,则可以看到该方法,否则就看不到。

主题说:

private关键字是成员访问修饰符。私人访问是最重要的 最小允许访问级别。只能访问私人成员 在声明它们的类或结构体中 (……)

更重要的是:

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

因此,下面的代码将完美地工作

class Foo
{
    private void PrivateMethod()
    {
    }
    class FooBaby
    {
        public static void MethodB()
        {
            Foo foo = new Foo();
            foo.PrivateMethod();
        }
    }
}
关于“为什么”类有访问修饰符而不是对象的问题,这是OOP中隐藏信息的方式之一(阅读更多信息)

我还建议您阅读以下章节:

  • 10.5成员访问
  • 17.2.3访问修改器

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

例如,如果您有一个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
修饰符强制原则

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

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


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

我不确定您在这里描述了什么。您能发布一些示例吗?如果没有对象引用,您不能从同一类中的静态方法调用非静态方法。我知道这一点,正如我在帖子中所指定的。问题是它为什么工作是的@Arno,或者Object.Equals(Object otherObject),这实际上是使用其他实例的私有成员的一个很好的例子。@ArnoSluismans对于两个对象来说可能是正确的:a.GetHashCode()==B.GetHashCode(),但是a.Equals(B)==错。我不明白为什么这里没有评论,至少应该有人说谢谢。好吧,谢谢,这就清楚了。@Martin Upvote足以说谢谢:)基本上它取代了“+1”等答案。