class NewList<T> : List<T>
T[] _items
などの内部構造にアクセスできないのはなぜですか?List <T>の派生クラスの内部にアクセスできないのはなぜですか?
なぜ保護されていませんが、プライベートですか?
これには構成を使用する必要がありますか?
class NewList<T> : List<T>
T[] _items
などの内部構造にアクセスできないのはなぜですか?List <T>の派生クラスの内部にアクセスできないのはなぜですか?
なぜ保護されていませんが、プライベートですか?
これには構成を使用する必要がありますか?
著者(Microsoft)が安全性の理由からアクセスするつもりはなかったため、それらはプライベートです。
継承の代わりに合成を使用する必要があります。あなたのクラスはList<T>
の代わりにIList<T>
を直接公開してください。
List<T>
は、パブリックAPIで直接公開することはできません(これは実際には設計ガイドラインで指定されています)。内部実装の詳細としてのみ使用する必要があります。
私は彼らが「安全」の理由であるとは思っていません。「正確さ」のように –
適切なAPIとカプセル化の主な目標の1つは安全の一形態です。 –
List<T>
は基本クラスではありません。代わりにSystem.Collections.ObjectModelのいずれかのクラスを使用する必要があります。
THanks、MSがクラスを封印しなかった理由は分かりますか? –
私はそれを知らない。しかし、それは間違いなく状況をはっきりさせるだろう。 – Andy
@Reed:うん、今は封印されていない唯一の理由は、[それが意味を成すと仮定した] [悪い]コードを破るということだと思う。 –
T [] _itemsなどの内部構造にアクセスできないのはなぜですか?
Reflectorによると、_itemsはプライベートです。アンダースコアはプライベートメンバーを示唆
なぜ保護されていませんが、 はプライベートですか?
_itemsの場合、Microsoftは公開ToArrayメソッドを提供しています。 _itemsを返します。
ありがとうございます。私はその方法を知っていますが、アクセシビリティのために余分なコレクションを作成するので、それは私のコレクションに大きなペナルティとなります。 –
はい、そうです。 –
実際には、基礎となるストレージまたはそのコピーを返します。 ToArray-ed配列内の項目を変更すると、リストの内容が変更されますか? – spender
これは、オブジェクトが常に正しい状態を維持できるようにするために、(絶対に)必要な場合にのみ、公開メンバーが実行されるように設計されています。また、フィールド(_items)を保護されたものとして公開することはお勧めできません。保護されたプロパティが必要です。この場合、すでに公開されている財産(this [])があります。
構成によって保護されていないメンバーもアクセスできます。
あなたはそれを必要としません。つまり、プロパティではできないことは、_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
私は少なくとも2つのことを考えることができます:(1)リスト項目を 'ref'パラメータとして外部コードや' Interlocked.CompareExchange'のようなメソッドに渡します。 (2) 'List
私はここに何かが欠けていますか? T [] _itemsはListの私的メンバーのようですが、継承なしでも直接アクセスすることはできません。どのように構成がここに役立つのですか –