2009-08-10 8 views
0
class NewList<T> : List<T> 

T[] _itemsなどの内部構造にアクセスできないのはなぜですか?List <T>の派生クラスの内部にアクセスできないのはなぜですか?

なぜ保護されていませんが、プライベートですか?

これには構成を使用する必要がありますか?

+0

私はここに何かが欠けていますか? T [] _itemsはList の私的メンバーのようですが、継承なしでも直接アクセスすることはできません。どのように構成がここに役立つのですか –

答えて

7

著者(Microsoft)が安全性の理由からアクセスするつもりはなかったため、それらはプライベートです。

継承の代わりに合成を使用する必要があります。あなたのクラスはList<T>の代わりにIList<T>を直接公開してください。

List<T>は、パブリックAPIで直接公開することはできません(これは実際には設計ガイドラインで指定されています)。内部実装の詳細としてのみ使用する必要があります。

+0

私は彼らが「安全」の理由であるとは思っていません。「正確さ」のように –

+3

適切なAPIとカプセル化の主な目標の1つは安全の一形態です。 –

2

List<T>は基本クラスではありません。代わりにSystem.Collections.ObjectModelのいずれかのクラスを使用する必要があります。

+1

THanks、MSがクラスを封印しなかった理由は分かりますか? –

+2

私はそれを知らない。しかし、それは間違いなく状況をはっきりさせるだろう。 – Andy

+0

@Reed:うん、今は封印されていない唯一の理由は、[それが意味を成すと仮定した] [悪い]コードを破るということだと思う。 –

1

T [] _itemsなどの内部構造にアクセスできないのはなぜですか?

Reflectorによると、_itemsはプライベートです。アンダースコアはプライベートメンバーを示唆

なぜ保護されていませんが、 はプライベートですか?

_itemsの場合、Microsoftは公開ToArrayメソッドを提供しています。 _itemsを返します。

+0

ありがとうございます。私はその方法を知っていますが、アクセシビリティのために余分なコレクションを作成するので、それは私のコレクションに大きなペナルティとなります。 –

+1

はい、そうです。 –

+0

実際には、基礎となるストレージまたはそのコピーを返します。 ToArray-ed配列内の項目を変更すると、リストの内容が変更されますか? – spender

1

これは、オブジェクトが常に正しい状態を維持できるようにするために、(絶対に)必要な場合にのみ、公開メンバーが実行されるように設計されています。また、フィールド(_items)を保護されたものとして公開することはお勧めできません。保護されたプロパティが必要です。この場合、すでに公開されている財産(this [])があります。

構成によって保護されていないメンバーもアクセスできます。

0

あなたはそれを必要としません。つまり、プロパティではできないことは、_itemsで何ができますか?彼らはインデクサーを使って配列の配列にシンプルで機能的な抽象を与えました。それは非常に軽量です - それは境界をチェックし、(セッター上の)リストのバージョンを増やします...

var lst = new List<int>() { 1, 2, 3, 4, 5 }; 
lst[0].Dump(); // 1 
lst.Dump(); // 1, 2, 3, 4, 5 
lst[0] = 2; 
lst.Dump(); // 2, 2, 3, 4, 5 
+0

私は少なくとも2つのことを考えることができます:(1)リスト項目を 'ref'パラメータとして外部コードや' Interlocked.CompareExchange'のようなメソッドに渡します。 (2) 'List 'を継承する型の場合、アイテムの個々のフィールドにアクセスする(それらを変更するか、' ref'パラメータとして渡すことを含む)。 – supercat

関連する問題