Коллекции. Параметризованные классы
Stack
| Count | Возвращает число элементов, которое хранится в классе Stack |
| IsSynchronized | Возвращает значение, определяющее, является ли доступ к классу Stack синхронизированным (потокобезопасным) |
| SyncRoot | Возвращает объект, который может быть использован для синхронизации доступа к классу Stack |
Класс Stack допускает в качестве действительного значение "пустая ссылка", а также допускает наличие повторяющихся элементов.
Ниже приведен пример создания и инициализации класса Stack и способ вывода его значений:
using System;
using System.Collections;
public class SamplesStack {
public static void Main()
{
// Creates and initializes a new Stack.
Stack myStack = new Stack();
myStack.Push("Hello");
myStack.Push("world");
myStack.Push("!");
// Displays the properties and values of the Stack.
Console.WriteLine( "myStack" );
Console.WriteLine( "\tCount: {0}", myStack.Count );
Console.Write( "\tValues:" );
PrintValues( myStack );
}
public static void PrintValues( IEnumerable myCollection )
{
System.Collections.IEnumerator myEnumerator = myCollection.GetEnumerator();
while ( myEnumerator.MoveNext() )
Console.Write( "\t{0}", myEnumerator.Current );
Console.WriteLine();
}
}
Листинг
12.5.
Результат:
myStack
Count: 3
Values: ! world HelloПеречислитель
Наследует интерфейс IEnumerator, который является основным для всех перечислителей. Поддерживает простое перемещение по коллекции.
| MoveNext | Перемещает перечислитель на следующий элемент коллекции |
| Reset | Устанавливает перечислитель в исходное положение перед первым элементом коллекции |
Перечислитель позволяет считывать (только считывать!) информацию (данные) из коллекции. Перечислители не используются для изменения содержания коллекции. Для этого применяются специфические методы данной коллекции ( Enqueue, Dequeue, Push, Pop ).
Вновь созданный перечислитель размещается перед первым элементом коллекции. Метод Reset возвращает перечислитель обратно в положение перед первым элементом коллекции.
В этом положении обращение к свойству Current приводит к возникновению исключения. Поэтому необходимо вызвать метод MoveNext, чтобы переместить перечислитель на первый элемент коллекции до считывания значения свойства Current.
Свойство Current не меняет своего значения (возвращает ссылку на один и тот же член коллекции), пока не будет вызван метод MoveNext или Reset.
Метод MoveNext обеспечивает изменение значения свойства Current.
Завершение перемещения по коллекции приводит к установке перечислителя после последнего элемента коллекции. При этом вызов метода MoveNext возвращает значение false. Если последний вызов метода MoveNext вернул значение false, обращение к свойству Current приводит к возникновению исключения. Последовательный вызов методов Reset и MoveNext приводит к перемещению перечислителя на первый элемент коллекции.
Перечислитель действителен до тех пор, пока в коллекцию не вносятся изменения. Если в коллекцию вносятся изменения (добавляются или удаляются элементы коллекции), перечислитель становится недействительным, а следующий вызов методов MoveNext или Reset приводит к возникновению исключения InvalidOperationException.
После изменения коллекции в промежутке между вызовом метода MoveNext и новым обращением к свойству Current, свойство Current возвращает текущий элемент коллекции, даже если перечислитель уже недействителен.
Перечислитель не имеет монопольного доступа к коллекции, поэтому перечисление в коллекции не является потокобезопасной операцией. Даже при синхронизации коллекции другие потоки могут изменить ее, что приводит к созданию исключения при перечислении. Чтобы обеспечить потокобезопасность при перечислении, можно либо заблокировать коллекцию на все время перечисления, либо перехватывать исключения, которые возникают в результате изменений, внесенных другими потоками.