суббота, 31 января 2009 г.

Создание массивов через CreateInstance

В данном посте хочется рассмотреть возможность создания массива через CreateInstance объекта System.Array.
Данный метод имеет несколько перегруженных вариантов. Остановимся на первом самом простом:

public static Array CreateInstance( Type elementType, int length).

Пример создания массива с использованием данного метода приведен ниже:

Array arr=Array.CreateInstance(typeof(int),5);
Console.WriteLine("Rank: {0}, length: {1}",arr.Rank, arr.Length);

В результате исполнения данного кода получаем одномерный массив на 5 элементов.
Пример использования данного массива:

for(int i=0;i<arr.Length;++i)
arr[i]=i;

Предположим, что нас не устраивает начальный индекс в массиве (мы знаем, что элементы массива имеют индекс, который начинается с нуля).
Если мы посмотрим нижнюю границу, то увидим следующее:

Array arr=Array.CreateInstance(typeof(int),5);
Console.WriteLine("Rank: {0}, length: {1}, Lower bound: {2}",arr.Rank, arr.Length, arr.GetLowerBound(0));

нижняя граница: 0. Узнать нижнюю границу можно через метод GetLowerBound, передав в качестве параметра измерение (измерения начинаются тоже с нуля).
Изменим наш код так, чтобы идекс начинался с 5, а в массиве было 5 элементов. В этом случае элементы массива будут индексироваться с 5 до 10. Посмотрим код:

Array arr=Array.CreateInstance(typeof(int),new int[1]{5},new int[1]{5});
Console.WriteLine("Rank: {0}, length: {1}, Lower bound: {2}",arr.Rank, arr.Length, arr.GetLowerBound(0));
for(int i=arr.GetLowerBound(0);i<arr.GetUpperBound(0);++i)
{
arr.SetValue(i,i);
Console.WriteLine("element: {0}",arr.GetValue(i));
}

Здесь использовалась перегруженная функция CreateInstance объекта Array:

public static Array CreateInstance( Type elementType, int[] lengths, int[] lowerBounds ),

которая берет массив длин по измерениям, а также массив нижних индексов по каждому измерению.
Метод GetUpperBound позволяет получить верхнюю границу изменения индекса по измерению, которое задается в качестве параметра. Как я уже упомянул ранее, измерения нумеруют с 0.

Еще 2 функции, которые были использованы:

public Object GetValue( int index ) - метод, который позволяет получить значение элемента массива в заданной с помощью параметра позиции

public void SetValue( Object value, int index ) - метод, который помещает value в позицию элемента массива с индексом index.