Типът System.Array
Всички масиви в .NET Framework наследяват типа System.Array. Това наследяване става неявно и се извършва от CLR. Абстрактният тип System.Array предлага няколко метода и свойства, който също се наследяват от всички масиви. В следващите таблици ще разгледаме по-важните методи и свойства на System.Array.
Свойства
Свойство
|
Описание
|
Rank
|
Връща броя на размерностите (измеренията) на масива.
|
Length
|
Връща цяло число от тип System.Int32, което представлява общия брой на елементите (от всички размерности) на масива.
|
LongLength
|
Връща цяло число от тип System.Int64, което представлява общия брой на елементите (от всички размерности) на масива.
|
Забележка: Изброените свойства са достъпни само за четене.
Методи
Метод
|
Описание
|
GetLength(…)
|
Връща броя на елементите по дадена размерност.
|
GetEnumerator()
|
Връща имплементация на интерфейса IEnumerator за елементите на масива. Това дава възможност да се използва конструкцията foreach(…), чрез която може да се обходят всички елементи на масива. Обхождането за многомерни масиви става отляво на дясно по размерностите, т.е. най-дясното измерение се сменя най-бързо.
|
Reverse(…)
|
Статичен метод на System.Array. Обръща елементите на даден едномерен масив в обратен ред. Ако масивът не е едномерен се подава RankException.
|
Clear(…)
|
Статичен метод на System.Array. Задава стойност 0 (null за референтни типове) на елементите в зададен интервал.
|
Sort(…)
|
Статичен метод на System.Array. Сортира елементите на даден масив по големина.
|
BinarySearch(…)
|
Статичен метод на System.Array. Търси за даден елемент в даден масив чрез метода на двоичното търсене. Методът предполага, че елементите на масива се подредени по големина предварително.
|
IndexOf(…)
|
Статичен метод на System.Array. Връща индекса на първото срещане на дадена стойност в даден едномерен масив. Ако елементът не се среща в масива, връща -1. Ако масивът не е едномерен, се подава RankException.
|
LastIndexOf(…)
|
Статичен метод на System.Array. Връща индекса на последното срещане на дадена стойност в даден едномерен масив. Ако елементът не се среща в масива връща -1. Ако масивът не е едномерен се подава RankException.
|
CreateInstance(…)
|
Статичен метод на System.Array. Създава динамично (по време на изпълнение) инстанция на типа System.Array, като може да се зададе тип на елементите, брой размерности, долна граница и брой елементи за всяка размерност.
|
Copy(…)
|
Статичен метод на System.Array. Копира елементите на един масив (или част от тях) в друг масив. Този метод извършва, ако е необходимо, преобразуване на типовете на масивите.
| Имплементирани интерфейси
Типът System.Array имплементира следните интерфейси: ICloneable, IList, IEnumerable и ICollection. Тези интерфейси (методите, свойствата и индексаторите, които предлагат) улесняват използването на масивите в множество и разнообразни ситуации.
Ще разгледаме малко по-подробно всеки един от имплементираните интерфейси:
-
ICloneable – предоставя метод Clone(), който се използва за клониране на масив. По подразбиране масивите се копират плитко (shallow copy). Това означава, че ако копираме масив от референтни типове, елементите на новия масив ще сочат към същото място в паметта, към което са сочили съответно елементите от стария масив.
-
IList – предоставя директен (пряк) достъп до елементите на масива. Типът System.Array експлицитно (явно) имплементира всеки един от методите на IList.
-
IEnumerable – предоставя метода GetEnumerator(), чрез който могат да се обходят всички елементи на масива (виж таблицата с методите на класа System.Array).
-
ICollection – осигурява свойството Count (размер) и средства за синхронизация на достъпа до елементите. ICollection от своя страна имплементира IEnumerable.
Създаване на ненулево-базиран масив – пример
В следващия пример ще илюстрираме как е възможно създаването на масив в .NET Framework, чиято долна граница не е 0:
using System;
class NonZeroBasedArray
{
static void Main()
{
int[] lowerBounds = { 2, 3 };
int[] lengths = { 5, 3 };
int[,] myArray = (int[,]) Array.CreateInstance(
typeof(int), lengths, lowerBounds);
myArray[3,3] = 10;
myArray[6,4] = 20;
// myArray[0,0] = 40; will throw IndexOutOfRangeException
for( int i=myArray.GetLowerBound(0); i<=myArray.GetUpperBound(0); i++ )
{
for( int j=myArray.GetLowerBound(1); j<=myArray.GetUpperBound(1); j++ )
{
Console.WriteLine("[{0},{1}]={2}", i, j, myArray[i,j]);
}
Console.WriteLine();
}
}
}
|
Ето резултатът от изпълнението на програмата:
В примера използваме вече разгледания статичен метод Array. CreateInstance(…), който приема като параметри типа на масива, който се създава, както и два масива от тип System.Int32 – първият с дължините на всяка размерност, а вторият – с долните граници за всяка от размерностите. Използваме още и методите GetLowerBound(…) и GetUpperBound(…), които връщат съответно долната и горната граница за дадена размерност.
За удобство върнатият от метода CreateInstance(…) обект може да се преобразува към очаквания тип. В горния пример това е типът int[,].
Странно, но факт е, че в .NET Framework това преобразуване не може да стане, ако очакваният масив е едномерен и първият елемент на масива не е 0 (CLR подава InvalidCastException). Ето един такъв пример:
int[] lowerBounds = { 2 };
int[] lengths = { 5 };
int[] arr = (int[]) Array.CreateInstance(
typeof(int), lengths, lowerBounds);
// System.InvalidCastException is thrown
|
Ако искаме да ползваме едномерни масиви, трябва да ползваме методите на System.Array: GetValue(…) и SetValue(…), които ни дават достъп до елементите на масива. Следният код демонстрира това:
int [] lengths = {6};
int [] bounds = {5};
Array array = Array.CreateInstance(
typeof(double), lengths, bounds);
for (int i=array.GetLowerBound(0); i<=array.GetUpperBound(0); i++)
{
array.SetValue(7, i);
}
|
Сподели с приятели: |