2011-09-06 12 views
10

可能性の重複:
Why are my privates accessible?
Why are private fields private to the type, not the instance?クラスインスタンスのプライベートメンバーがEquals()メソッド本体で利用できるようになるのはなぜですか?

は、おそらく私は明白な事実をしないのですが、私は本当に理由を見ることができない。

Iに等しいをオーバーライドし

( )メソッドと私のタイプにオブジェクトをキャストすると、 私はできる プライベートメンバーを問題なく使用してください!

インスタンスを初期化していますが、プライベートメンバーに到達できないと考えています。

なぜ、キャストされたオブジェクトがEquals()メソッドで私の秘密を私に公開するのですか?

は、以下のサンプルコードでの対等の実装を参照してくださいと「その」に私はプライベートフィールドに達しています方法を見てインスタンス:

public class Animal 
{ 
    private string _name; 
    private int _age; 

    public Animal(int age, string name) 
    { 
     _name = name; 
     _age = age; 
    } 

    public override bool Equals(object obj) 
    { 
     var that = (Animal) obj; 


     //_name and _age are available on "that" instance 
     // (But WHY ???) 
     return 
      this._age == that._age 
      && this._name == that._name; 

    } 
} 


    class Program 
    { 
     static void Main(string[] args) 
     { 
      var cat1 = new Animal(5, "HelloKitty"); 
      var cat2 = new Animal(5, "HelloKitty"); 

      Console.Write(cat1.Equals(cat2)); 
      Console.Read(); 
     } 
    } 
+0

これらの変数を変更して値を変更しようとしましたか?冷たいことを試してみてください。 – Burimi

答えて

17

プライベートメンバーがいない場合に、クラスにプライベートです。

Animalクラスの内部では、渡された(または、この場合は正常にキャストされた)Animalの任意のインスタンスのプライベートメンバーにアクセスできます。

+5

OPを明確にするために、この動作は 'Equals()'メソッドと全く関係がありません。この点で特別なことではありません。 'Animal'(静的メソッドを含む)で定義されたメソッドは、与えられた' Animal'オブジェクト上のプライベートメンバーにアクセスできます。 – cdhowie

8

プライベートメンバーは、クラスではなくインスタンスではないため、使用できます。 Animalクラス内にいるため、異なるインスタンスのプライベートメンバーにアクセスすることができます。 public override bool Equals(object obj)がクラスAnimalの一部であるためWhy are private fields private to the type, not the instance?

1

:ここ

はこの言語機能の前に議論へのリンクです。

Equalsは、Animalの静的メンバーであり、この方法では、Animalのプライベートメンバーを見ることができないと考えていたので、あなたのことを混乱させるかもしれません。またはxDではないかもしれません。

+1

この動作は、メソッドの静的性とは何の関係もありません。 – cdhowie

+0

確かにそうではありません。これは、外部のオブジェクトをAnimalクラスにキャストして、外部のオブジェクトであってもそれを見ることができる(しかし、Animalクラスの内部であるため、オブジェクトが 'Animal' )。 私はなぜ、 @pencilCakeは混乱しました。 – Canella

関連する問題