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

otherTestClass._privateStringこのコードは C# でコンパイルされ、同等のものが PHP で動作しますが、ここで変更できる理由を誰かが説明できますか?

クラスのインスタンスは、どのような状況でもプライベートメンバー変数を変更できないはずであり、アクセスしようとするとotherTestClass._privateString「保護レベルのためにアクセスできません」というエラーが発生すると考えていました。

ただし、そうではないのに、オブジェクトを独自のクラス内でインスタンス化すると、プライベート メンバーにアクセスできるようになるのはなぜでしょうか? そして、これはカプセル化をある程度壊しませんか?それとも明らかな何かが欠けていますか?

  • (上記のクラスの設計が良い方法であるかどうかを尋ねているのではなく、その背後にある理論について疑問に思っているだけです。)

編集- 回答とコメントをありがとう。明確にするために、これを実行できることが肯定的な機能と見なされるかどうか、またはコンパイル時のチェック/コードの明確さ/他のほとんどの言語がそのように行うため、それが必要なトレードオフであるかどうかも知りたいです。理想的には、コンパイラがこれを防止または警告するように思えますが、そうなると、私は言語設計者とはほど遠いものになります。このようにすることで、(カプセル化に違反することなく)何か便利なことを行うことができる方法の例は、そうでなければ困難または不可能になるでしょう。

4

2 に答える 2

35

プライベート メンバーは、そのクラスのプログラム テキスト内 (入れ子になった型内を含む) の任意のコードにアクセスできます。扱っているクラスのインスタンスとは関係ありません。

これがカプセル化に違反しているとは思いません.APIはまだ実装から分離されていますが、実装は、どのインスタンスを見ているかに関係なく、それ自体について「認識」しています.

他のいくつかの言語では、これはアクセシビリティーの仕組みではないと思いますが、C# と Java では間違いなくそうです。(Java では、何がプライベート メンバーにアクセスできるかについて少し異なるルールがありますが、作成したコードを変換したコードは引き続き機能します。)

于 2010-11-22T11:15:13.217 に答える
9

これは、C# がオブジェクト レベルのプライバシーではなく、クラス レベルのプライバシーを適用するためです。

C#、C++、Java など、主流のほとんどの言語で同じポリシーが適用されます。その理由は次のとおりだと思います。

1) 開発者はその種のポリシーに慣れているため。

2) オブジェクト レベルのプライバシーは、利点がほとんどない代わりに非常に退屈になるためです。

于 2010-11-22T11:20:34.777 に答える