22

質問が十分に説明的であるかどうかはわかりませんが、なぜ、どのようにこの動作が存在するのですか?:

public class Layer
{
    public string Name { get; set; }

    private IEnumerable<Layer> children;
    public IEnumerable<Layer> Children
    {
        get { return this.children.Where ( c => c.Name != null ).Select ( c => c ); }
        set { this.children = value; }
    }

    public Layer ( )
    {
        this.children = new List<Layer> ( ); // Fine

        Layer layer = new Layer ( );
        layer.children = new List<Layer> ( ); // Isn't .children private from the outside?
    }
}

layer.Childrenどこからでもアクセスできますが、layer.childrenプライベートなのでどうすればアクセスできますか?

Layer layer = new Layer ( );
layer.children = new List<Layer> ( );

コードがLayerクラス内にある場合にのみ機能します。アクセスが外部からのものであっても、それが包含クラスの内部で行われる場合、プライベート変数へのアクセスを異なる方法で処理するための特別なコードはありますか?

私は使用する理由を知っています:

this.children = ...

包含クラス内にありますが、新しいインスタンスを作成して外部から変更することは、それらがまだ包含クラス内にある場合でも、良い習慣とは思えません。

これを許可する理由は何ですか?

4

3 に答える 3

27

C#言語仕様のセクション3.5.1を参照してください。関連するテキストは次のとおりです。

プライベート。メンバー宣言にプライベート修飾子を含めることによって選択されます。プライベートの直感的な意味は、「包含タイプに限定されたアクセス」です。

修飾子は、インスタンスではなく、タイプに関連していることに注意してください。

そして、セクション3.5.2で、いくつかのルールについてさらに説明します。

直感的に言えば、タイプまたはメンバーMにアクセスすると、アクセスが許可されていることを確認するために次の手順が評価されます。

  • まず、Mが(コンパイル単位や名前空間ではなく)型内で宣言されている場合、その型にアクセスできないとコンパイル時エラーが発生します。
  • 次に、Mがパブリックの場合、アクセスが許可されます。
  • それ以外の場合、Mが内部で保護されている場合、Mが宣言されたプログラム内で発生した場合、またはMが宣言されたクラスから派生したクラス内で発生し、派生クラスタイプを介して発生した場合にアクセスが許可されます(§ 3.5.3)。
  • それ以外の場合、Mが保護されている場合、Mが宣言されているクラス内で発生する場合、またはMが宣言されているクラスから派生し、派生クラスタイプ(§3.5 .3)。
  • それ以外の場合、Mが内部である場合、Mが宣言されているプログラム内で発生するとアクセスが許可されます。
  • それ以外の場合、Mがプライベートの場合、Mが宣言されているタイプ内で発生するとアクセスが許可されます。
  • そうしないと、タイプまたはメンバーにアクセスできなくなり、コンパイル時エラーが発生します。
于 2011-04-20T23:06:38.603 に答える
7

これは一般的な設計です。クラスを書いた人は誰でも、クラスを適切に操作する方法を知っており、プライベートメンバーに直接アクセスすることの意味を理解していると想定されています。したがって、同じクラスの他のインスタンスのプライベートメンバーにアクセスすることはしばしば機能します。C ++の構成に精通してfriendいる場合は、同じクラスのインスタンスがすべて互いに友達であるように見えます(ただし、C#にはfriend公式には概念がありません)。

これはC#とJavaで機能します。これらは、私が頭の中で知っている2つの言語です。他の多くの言語でもこれが許可されているに違いありません(誰かがチャイムを鳴らしたいですか?)

于 2011-04-20T23:02:18.217 に答える
3

プライベートアクセス修飾子はを言うことを忘れないでくださいPrivate members are accessible only within the body of the class or the struct in which they are declared。この説明は紛らわしいですが、制限がクラスレベルとであることが明確に示されていますNOT OBJECT LEVEL。この場合、レイヤーはまだクラス内にあります。

これは前にここで議論されました。オブジェクトを使用してプライベート変数にアクセスできますか

于 2011-04-20T23:11:09.210 に答える