Российский Государственный Технологический Университет им. К.Э. Циолковского
Опубликован: 02.03.2007 | Доступ: свободный | Студентов: 5636 / 790 | Оценка: 3.96 / 3.45 | Длительность: 27:04:00
ISBN: 978-5-9556-0086-4
Лекция 12:

Коллекции. Параметризованные классы

< Лекция 11 || Лекция 12: 1234 || Лекция 13 >

Stack

Открытые конструкторы
Stack Перегружен. Инициализирует новый экземпляр класса Stack
Открытые свойства
Count Возвращает число элементов, которое хранится в классе Stack
IsSynchronized Возвращает значение, определяющее, является ли доступ к классу Stack синхронизированным (потокобезопасным)
SyncRoot Возвращает объект, который может быть использован для синхронизации доступа к классу Stack
Открытые методы
Clear Удаляет все объекты из класса Stack
Clone Создает неполную копию класса Stack
Contains Определяет, принадлежит ли элемент классу Stack
CopyTo Копирует элементы класса Stack в существующий одномерный массив класса Array, начиная с указанного индекса массива
GetEnumerator Интерфейс IEnumerator для класса Stack
Peek Возвращает самый верхний объект класса Stack, но не удаляет его
Pop Удаляет и возвращает верхний объект класса Stack
Push Вставляет объект в начало класса Stack
Synchronized Возвращает синхронизированную (потокобезопасную) обертку класса Stack
ToArray Копирует элементы класса 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, который является основным для всех перечислителей. Поддерживает простое перемещение по коллекции.

Открытые свойства
Current Возвращает текущий элемент коллекции
Открытые методы
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 возвращает текущий элемент коллекции, даже если перечислитель уже недействителен.

Перечислитель не имеет монопольного доступа к коллекции, поэтому перечисление в коллекции не является потокобезопасной операцией. Даже при синхронизации коллекции другие потоки могут изменить ее, что приводит к созданию исключения при перечислении. Чтобы обеспечить потокобезопасность при перечислении, можно либо заблокировать коллекцию на все время перечисления, либо перехватывать исключения, которые возникают в результате изменений, внесенных другими потоками.

< Лекция 11 || Лекция 12: 1234 || Лекция 13 >
kewezok kewezok
kewezok kewezok
Елена Шляхт
Елена Шляхт
Объясните плиз в чем отличие а++ от ++а
Почему результат разный?
int a=0, b=0;
Console.WriteLine(a++); //0
Console.WriteLine(++b); //1
a++;
++b;
Console.WriteLine(a); //2
Console.WriteLine(b); //2