ка перечіслітеля. Тому такого поняття, як «поточний елемент», немає. [1]
Інтерфейс IEnumerator.
Цей інтерфейс призначений для перебору значень колекції. До складу цього інтерфейсу входять: MoveNext (), Reset () і властивість Current. () Дозволяє скинути стан перечіслітеля в початковий стан. У цьому стані Нумератор знаходиться відразу після його створення, при цьому перехід до наступного елементу призведе до того, що поточним елементом стане перший елемент колекції. [1]
Метод MoveNext () якраз і здійснює перехід до наступного елементу колекції. Таким чином, MoveNext () потрібно викликати безпосередньо перед зверненням до першого або наступного елементу.
Властивість Current надає доступ до поточного елементу. [1]
Нижче представлений приклад використання цього інтерфейсу.
enumerator=((IEnumerable) someCollection) .GetEnumerator (); (enumerator.MoveNext ())
{elem=(ElemType) enumerator.Current ();
//... якісь дії з елементом колекції.
}
Будь-яка зміна вмісту колекції або кількості її елементів призводить до того, що Нумератор стає недійсним. Так що якщо колекція змінилася, спроба звернутися до методів або властивостям інтерфейсу IEnumerator повинна викликати виключення. Але ці інтерфейси - це всього лише декларація намірів. Реалізація інтерфейсів цілком і повністю лежить на розробниках конкретних класів. Так, всі колекції, що входять в простір імен System.Collections, підтримують цю угоду. Але IEnumerator реалізується також і вбудованими масивами, які цьому правилу не задовольняють. [2]
Використовувати в'язку IEnumerable/IEnumerator найзручніше за допомогою оператора foreach. Так, наведений вище приклад можна переписати наступним чином:
(ElemType elem in someCollection)
{
//... якісь дії з елементом колекції.
}
Інтерфейс ICollection
Інтерфейс ICollection успадковується від IEnumerable:
interface ICollection: Ienumerable
Він визначає властивість, за допомогою якого можна отримати число елементів колекції:
Count {get;}
Крім цього властивості, інтерфейс визначає метод:
CopyTo (Array array, int index);
Завданням цього методу є копіювання елементів колекції в масив. Копіювання виробляється, починаючи з елемента, індекс якого вказаний як другий аргумент методу. Посилання на масив передається в якості першого параметра. Розмір масиву повинен бути достатнім для розміщення копійованих елементів. [1]
Властивість SyncRoot повертає посилання на об'єкт, який повинен використовуватися для синхронізації доступу до об'єкта. Необхідність у такому об'єкті виникає при створенні складних колекцій. Нижче представлений приклад використання властивості SyncRoot:
(myCollection.SyncRoot)
{[0]=myCollection [1] + myCollection [2];
}
Для забезпечення коректної роботи колекції в многопоточной середовищі часто буває зручно не робити синхронізацію вручну, а скористатися обгорткою навколо колекції, що забезпечує синхронізацію доступу до колекції. Властивість IsSynchronized дозволяє визначити, чи потрібна така обгортка наявної посиланні на колекцію, або вона вже й так потокобезпечна. [2]
Інтерфейс IList.
Описані вище методи і властивості дозволяють просто «ганяти» ітератори від одного елемента колекції до іншого, і дізнаватися кількість елементів колекції. Якщо не будуть реалізовані власні методи доступу до даних колекції, колекцією користуватися не вдасться. Так от, інтерфейс IList надає поліморфний механізм маніпуляції даними колекції:
interface IList: ICollection, Ienumerable
В інтерфейсі IList вперше зустрічається спосіб отримати або привласнити якесь значення елементу колекції. Це робиться за допомогою індексатора:
this [int index] {get; set; }
Аргументом в даному випадку є індекс елемента. [1]
Щоб додати елемент в колекцію, можна скористатися методом:
Add (object value);
Метод повинен повернути індекс доданого елемента. [1]
Якщо ж необхідно вставити елемент в конкретне місце колекції, то можна використовувати метод:
Insert (int index, object value);