Массивы - это быстрый способ перебора неупорядоченного набора элементов, и для них часто приятно быть доступными только для чтения. Хотя предоставление массивов с ключевым словом readonly бесполезно, поскольку содержимое массива все еще можно изменить, оболочка ReadOnlyCollection решает эту проблему. Проблема в том, что он в 4 раза медленнее, чем обычный массив в тестах, которые я сделал. (Я знаю, что возвращение копии массива приведет к снижению производительности только один раз, но в идеале я бы не хотел тратить на это время процессора).
Я заметил, что могу получить преимущество проверки работоспособности только для чтения, сохраняя при этом производительность простого массива с таким классом, как этот:
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 (;;), чтобы сохранить производительность. - Я писал код C, где каждый цикл был для (;;). Может быть, я испортился. - Если я реализую IEnumerable , то получаю ту же производительность, что и ReadOnlyCollection , и этот класс бесполезен.
Есть идеи, как добиться идеального сочетания всех трех целей: проверка работоспособности только для чтения, отсутствие потери производительности и удобный синтаксис foreach ()?