2011-07-01 12 views
5

C#のネストされた型は、親のプライベートプロパティにアクセスできます。この言語機能を持つ特別な理由はありますか?私の意見では、これはカプセル化を破る。ネストされた型をパブリックにすると、それを介して親クラスのプライベートプロパティを公開することができます。C#のネストされた型による親のプライベートプロパティへのアクセス

+3

不適切なデザインには無限の可能性があります。何もあなたがそれらを使用するように強制しません。 –

答えて

6

でも可能ですが、最初に外側のクラスと同じソースファイルに入れておけばそのクラスをネストできます。

ネストされたクラスは、外部クラスによって「所有」され、外部クラスの他のメンバーと同じエクステントに信頼されます。外部クラスのメソッドはプライベートプロパティも公開する可能性がありますが、あなたはそのコードをすべて所有しているので、そうではないと信じています。同様に、あなた(外部クラスの作成者)はネストされたクラスのすべてのコードを所有しています。ネストされたクラスでカプセル化を中断したくない場合は、カプセル化を破るコードを書くのは避けてください:)

+5

私は@Jon Skeetと同じことをやっているとは思っても誇りに思っています。でも、わずか38秒後です:) –

+1

ありがとうジョン。それは物事をクリアする。面白い部分は、私はあなたの本からコードスニペットを読んだ後に質問があったということです。 – Amrit

+0

私は、外部クラスを部分クラスを介して2つのソースファイルに分割し、ソースファイルの1つにネストされたクラスのみが含まれ、他のソースファイルに他のすべてが含まれるようにすることもできると思います。これは、部分クラスを乱用するようなものです。私はそれをすることをお勧めします。 – Brian

5

ネストされたクラスはメソッドと同じように、囲むクラスの一部です。それらを介してプライベートプロパティを公開しても、メソッドを介してプライベートプロパティを公開するよりも、カプセル化が破られることはありません。

C#がアクセス制御に使用するモデルは、を定義するクラス内のにアクセスでき、それが他の方法でどのように動作するかを確認するのが難しいです。

2

(IMO)ネストされたタイプは、囲みタイプの一部であるため、そのタイプの他の部分と同様に、privateメンバーにアクセスする必要があります。

タイプpublicの他の部分を作成した場合と同様に、タイプのプライベートプロパティが公開される可能性があります。

囲みタイプを書いた人だけが入れ子タイプを書くことができるので、実際のリスクはありませんか?

関連する問題