равно метод другого.

class TestClass
{
    private string _privateString = "hello";
    void ChangeData()
    {
        TestClass otherTestClass = new TestClass();
        otherTestClass._privateString = "world";
    }
}

код компилируется в C # и аналог работает в PHP, но кто-то может объяснить причину, почемуotherTestClass._privateString можно изменить здесь?

Я бы подумал, что экземпляр класса не должен быть в состоянии изменить личную переменную-член ни при каких обстоятельствах, и что пытается получить доступotherTestClass._privateString выдаст ошибку «недоступен из-за уровня защиты».

Однако это не тот случай, так почему создание экземпляра объекта внутри его собственного класса позволяет вам получить доступ к закрытым членам? И разве это не нарушает степень инкапсуляции? Или я что-то упускаю очевидное?

(Я не спрашиваю, является ли приведенный выше дизайн класса хорошей практикой, просто интересуюсь теорией, стоящей за этим.)

редактировать - Спасибо за ответы и комментарии. Чтобы уточнить, мне также интересно узнать, рассматривается ли возможность сделать это как положительную особенность, или это необходимый компромисс для лучшей проверки во время компиляции / ясности кода /, потому что большинство других языков делают это таким образом или как-то еще. Мне кажется, что в идеале компилятор мог бы предотвратить или предупредить вас об этом, но тогда я далек от языкового дизайнера. Любые примеры того, как это позволяет вам делать что-то полезное (без нарушения инкапсуляции), что в противном случае было бы трудно или невозможно, было бы здорово.

Ответы на вопрос(2)

Ваш ответ на вопрос