:
// Sets or Gets the element at the given index.
//
public T this[int index] {
get {
// Fllowing trick can reduce the range check by one
if ((uint) index >= (uint)_size) {
ThrowHelper.ThrowArgumentOutOfRangeException();
}
return _items[index];
}
set {
if ((uint) index >= (uint)_size) {
ThrowHelper.ThrowArgumentOutOfRangeException();
}
_items[index] = value;
_version++;
}
}
お知らせ一覧の内部に対応する項目を設定する前に、その配列では、最初にプライベート_size
変数が範囲内にあることを確認します。ただし、_size
は配列のサイズに設定されていません。 Sizeは、ListのさまざまなAdd/Removeメソッドで増減します。したがって、初期容量が10のリストをインスタンス化しても、リストの配列の内部の容量です。ここではコンストラクタがある:あなたが/ AddRangeの/ etcを追加/削除のいずれかを使用しない限り、
// Constructs a List with a given initial capacity. The list is
// initially empty, but will have room for the given number of elements
// before any reallocations are required.
//
public List(int capacity) {
if (capacity < 0) ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.capacity, ExceptionResource.ArgumentOutOfRange_SmallCapacity);
_items = new T[capacity];
}
_size
が設定(したがって、0が初期化された値のままとして)されていません。またはIEnumerableを受け入れるコンストラクタを使用してください(この場合、サイズはIEnumerableの項目数になります)。
あなたがそれについて考えるならそれは意味があります。リストのアイデアは、容量を変更する必要があるときに数値インデックスの複雑さ(および醜さ)と配列のサイズ変更/コピーを心配する必要がないようにすることです。 Listがインスタンス化された後の内部配列のサイズは、開発者にとっては問題ではありません。内部配列の使用方法を微調整する場合は、独自の実装を作成するか、配列を使用するだけです。
出典
2016-05-16 20:26:36
DVK
「同じ動作をしてはいけませんか?」いいえ同じである必要があるのはなぜですか?それらは同じものではありません... – Eser
文字列 "asdf"をxに追加してから使用する必要があります。 x.add( "asdf")。今度はリストが空です。 – Auguste
なぜ彼らは同じ行動をとると思いますか?リストと配列は異なるものです。 – itsme86