0

私が構築しているライブラリで、(少なくとも私にとっては)やや奇妙な振る舞いをしました。

私はこの方法を持っています:

public class Lib
{
 private string field = "field";

 public string Field
 {
  get
  {
   return field;
  }
 }

 public void Add(Lib lib)
 {
  string field = DoSomething(lib);
  Console.WriteLine(field);
 }

 protected string DoSomething(Lib lib)
 {
  return lib.field;
 }
}

したがって、ライブラリを使用するプログラムからメソッドを呼び出すと、次のようになります。

Lib lib = new Lib();
Lib lib2 = new Lib();

lib.Add(lib2);

コンソールは私"field"を出力として提供します...今、私はそれがなぜ起こるのかよくわかりません。フィールドをプライベートとして宣言したのに、なぜ1つのクラスが他のクラスのプライベートプロパティにアクセスでき、アクセス制限に関する例外が発生しないのですか?!

私の理解では、aLibはとにかくそれ自体のフィールドにアクセスできますが、メソッドに他のインスタンスをLib指定すると、最初のインスタンスが秒のプライベートフィールドにアクセスできないようにする必要があります。インスタンスとプライベート!

4

3 に答える 3

1

これは仕様によるものであり、privateアクセス修飾子は含まれているタイプへのアクセスを制限します。タイプのインスタンスではありません。ネストされたタイプは、それを含むタイプのプライベートフィールドにもアクセスできます。

class MyType
{
    private string secret;

    public MyType(string secret) { this.secret = secret; }

    public void SomeMethod(MyType myType)
    {
        // Works because the private modifier pertains to the Type, not the instance
        Console.WriteLine(myType.secret); 
    }

    public class MyNestedType
    {
        public MyNestedType(MyType myType)
        {
            // Also works because the we are in a nested type of MyType
            Console.WriteLine(myType.secret); 
        }
    }
}

関連するリンク:アクセシビリティレベルプライベート

于 2009-12-02T08:02:15.507 に答える
0

privateは、インスタンスではなく、クラスに対してプライベートを意味します。

これは最初は奇妙だと思い、.NETで「バグ」を発見したと思いました。私がその理論を発表したとき、少年は私が元の場所に戻されました...

于 2009-12-02T08:09:35.120 に答える
0

「コンソールは出力として「フィールド」を提供します...今、なぜそれが発生するのかよくわかりません。フィールドをプライベートとして宣言したのに、あるクラスが他のクラスのプライベートプロパティにアクセスできるのに、なぜそれが提供されないのですか?アクセス制限についての例外?!」

しかし、他のクラスはフィールドに直接アクセスしていません; クラスのインスタンスのパブリックメソッドにアクセスするだけで、プライベートメンバーにアクセスします(クラスは独自のプライベートメンバーにアクセスする可能性があるため、これは許可されています。Libfield

それは私的なものなので、私の家に足を踏み入れて私のものを持っていくことができないと言っているようなものです。しかし、あなたは私のドアをノックして、私のものをあなたに与えるように私に頼むのは非常に自由です。それはそうするための公的な方法だからです。

于 2009-12-02T08:10:28.750 に答える