配列は、順序付けされていないアイテムのセットを反復処理するための高速な方法であり、多くの場合、読み取り専用であると便利です。配列の内容は変更される可能性があるため、「readonly」キーワードで配列を公開しても意味がありませんが、ReadOnlyCollection<T> ラッパーがこれを解決します。問題は、私が行ったテストでは、単純な配列よりも 4 倍遅いことです。(配列のコピーを返すと、パフォーマンスが低下するのは 1 回だけですが、理想的には、そのために CPU 時間を無駄にしたくありません。)
次のようなクラスを持つプレーン配列のパフォーマンスを維持しながら、読み取り専用の健全性チェックの利点を得ることができることに気付きました。
class ReadOnlyArray<T>
{
private readonly T[] array;
public ReadOnlyArray(T[] a_array)
{
array = a_array;
}
// read-only because no `set'
public T this[int i]
{ get { return array[i]; } }
public int Length
{ get { return array.Length; } }
}
問題は、foreach() 構文の便利さを失っていることです。つまり、パフォーマンスを維持するために for(;;) ループで反復する必要があります。-- 以前は、すべてのループが for(;;) である C コードを書いていました。甘やかされてしまったのかな。-- IEnumerable<T> を実装すると、ReadOnlyCollection<T> と同じパフォーマンスが得られますが、このクラスは役に立ちません。
読み取り専用のサニティ チェック、パフォーマンスの低下なし、便利な foreach() 構文という 3 つの目標すべての完璧な組み合わせを達成する方法はありますか?