Коллекции. Параметризованные классы
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 возвращает текущий элемент коллекции, даже если перечислитель уже недействителен.
Перечислитель не имеет монопольного доступа к коллекции, поэтому перечисление в коллекции не является потокобезопасной операцией. Даже при синхронизации коллекции другие потоки могут изменить ее, что приводит к созданию исключения при перечислении. Чтобы обеспечить потокобезопасность при перечислении, можно либо заблокировать коллекцию на все время перечисления, либо перехватывать исключения, которые возникают в результате изменений, внесенных другими потоками.