Почему у вас есть модификаторы доступа на уровне классов вместо уровня объекта?

При использовании С# я недавно понял, что я могу вызывать частные функции объекта 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.
    }
}

Ответы

Ответ 1

Когда вы делаете элемент частным, он является приватным для других классов, а не для самого класса.

Это может быть полезно, например, если у вас есть метод 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;
    }
}

Ответ 2

Модификатор private обеспечивает Encapsulation.

Идея заключается в том, что "внешний мир" не должен вносить изменения в внутренние процессы AClass, поскольку реализация AClass может со временем меняться (и вам придется изменить весь внешний мир, чтобы исправить различия в реализации, что почти невозможно).

Когда экземпляр AClass выполняет доступ к внутренним компонентам другого экземпляра AClass - вы можете быть уверены, что оба экземпляра всегда знают детали реализации AClass. Если логика внутренних процессов AClass изменена - все, что вам нужно сделать, это изменить код AClass.

Однако в некоторых других языках private работает на уровне экземпляра, но это не так на С#.

Ответ 3

Члены

Private доступны только из всех других членов в рамках этого класса. Не имеет значения, выполняется ли это несколькими экземплярами или одним экземпляром.

Вы пытаетесь вытеснить членов только для вызова из this., поэтому им не разрешено вызывать из внешнего мира (видимые с точки зрения экземпляра), но им разрешено вызывать один раз вы вошли в область вашего экземпляра. Это просто невозможно в С#.

Будет приятной особенностью, хотя...:)

Ответ 4

закрытый (ссылка на С#) говорит:

Частное ключевое слово - это модификатор доступа к членству. Частный доступ - это наименее разрешительный уровень доступа. Частные члены доступны только внутри тела класса или структуры, в которой они объявлены (...)

Еще больше:

Вложенные типы в одном и том же теле также могут обращаться к тем частным членам.

Таким образом, следующий код будет работать отлично.

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

В вопросе "почему" классы имеют модификаторы доступа, а не объекты, это один из способов скрыть информацию в ООП (подробнее об Encapsulation (объектно-ориентированное программирование).

Я также рекомендую вам ознакомиться с главами:

  • 10.5 Доступ пользователя
  • 17.2.3 Модификаторы доступа

Стандартная спецификация языка ECMA-334 С#.

Ответ 5

private означает, что вы можете получить доступ к нему только из самого класса. Является ли оно статичным или нет, не имеет никакого значения. Хотя это не исключение этого правила...

Кристофа

Ответ 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
    }
}

Итак, в основном его...

Публичная. Если вы можете увидеть класс, вы можете увидеть метод

Частный. Если вы являетесь частью класса, вы можете увидеть этот метод, в противном случае нет.