5

このクラスで見てみましょう:

    public class Cluster
    {
        private List<Point> points; //private field

        public float ComputeDistanceToOtherClusterCLINK(Cluster cluster)
        {
            var max = 0f;
            foreach (var point in cluster.points) // here points field are accessible
            {
                  .......
            }
            return max;
        }
    }

なぜプライベートフィールドにアクセスできるのですか?

この機能を使用できますか、それとも悪い習慣ですか?

4

7 に答える 7

8

なぜプライベートフィールドにアクセスできるのですか?

プライベートフィールドが定義されているのと同じクラス内にいるためです。

于 2012-05-25T13:43:14.583 に答える
4

疑わしい場合は、言語仕様を確認してください。

C#言語仕様によると、セクション3.5.1:

3.5.1宣言されたアクセシビリティ

メンバーの宣言されたアクセシビリティは、次のいずれかになります。

  • パブリック。これは、メンバー宣言にパブリック修飾子を含めることによって選択されます。パブリックの直感的な意味は、「アクセスが制限されていない」ということです。
  • Protected。これは、メンバー宣言に保護された修飾子を含めることによって選択されます。保護の直感的な意味は、「包含クラスまたは包含クラスから派生したタイプに限定されたアクセス」です。-内部。これは、メンバー宣言に内部修飾子を含めることによって選択されます。内部の直感的な意味は、「このプログラムに限定されたアクセス」です。
  • 保護された内部(保護されたまたは内部を意味する)。これは、メンバー宣言に保護された修飾子と内部修飾子の両方を含めることによって選択されます。保護された内部の直感的な意味は、「このプログラムまたは含まれているクラスから派生したタイプに限定されたアクセス」です。
  • プライベート。メンバー宣言にプライベート修飾子を含めることによって選択されます。プライベートの直感的な意味は、「包含タイプに限定されたアクセス」です。

前のセクションからわかるように、包含クラスのすべてのメソッド(この場合はCluster)はプライベートフィールドにアクセスできますpoints

...いいえ、これは悪い習慣ではありません。これはまさにプライベートフィールドの目的です。

于 2012-05-25T13:50:15.823 に答える
3

プライベートとは、クラススコープに対してプライベートを意味します。驚くべきことは、同じクラスの別のオブジェクトのプライベートフィールドにアクセスすることさえできるということです。

public class A
{
    private int _i;

    public bool AreEqual(A otherObject)
    {
        return this._i == otherObject._i;
    }
}

OOP(オブジェクト指向プログラミング)の主な側面の1つは、カプセル化です。これは、オブジェクトがプライベートデータ(フィールド)への直接アクセスを禁止していることを意味します。代わりに、データを操作およびアクセスするためのパブリックメソッド(プロパティゲッターおよびセッターを含む)を提供します。ただし、これは、これらのメソッドがこれらのプライベートフィールドにアクセスできる必要があることも意味します。そうでない場合、プライベートフィールドは完全に無意味になります。


明確化:しかし、私は、別のオブジェクトのプライベートメンバーにアクセスできることは予期せぬことであり、少なくとも部分的にはカプセル化の原則に違反していることに同意します。

于 2012-05-25T13:50:46.577 に答える
2

クラスのスコープ内でフィールドを定義するため、そのクラス内のものはプライベートフィールドにアクセスできます。これは明確に定義された動作であり、非常に便利であり、悪いプログラミング手法ではありません。

スコープを見ると役立つ場合があります。

于 2012-05-25T13:44:30.730 に答える
2

privateキーワードは、フィールドをそのクラスのオブジェクトインスタンスではなく、クラスに対してプライベートにします。したがって、そのクラス内のすべてのコードは、そのクラスのタイプのオブジェクトのそのフィールドにアクセスできます(もちろん、オブジェクトへの参照がある場合)。そうすることは決して悪い習慣ではありません。

于 2012-05-25T13:47:47.597 に答える
2

プライベートフィールドは、それが定義されているスコープで常にアクセス可能であり、プライベート変数はクラススコープで定義されているため、アクセス可能です。

于 2012-05-25T13:48:52.617 に答える
2

プライベートフィールドは、タイプ内でアクセスできます。ComputeDistanceToOtherClusterCLINKは、同じcalsのメンバーです。したがって、プライベートフィールドはメソッド本体からアクセスできる必要があります。

于 2012-05-25T13:55:03.843 に答える