Методические рекомендации по выполнению практических работ по междисциплинарному курсу
Скачать 2.6 Mb.
|
Конструкторы структуры Как и класс, структура может определять конструкторы. Но в отличие от класса нам не обязательно вызывать конструктор для создания объекта структуры: 1 User tom; Однако если мы таким образом создаем объект структуры, то обязательно надо проинициализировать все поля (глобальные переменные) структуры перед получением их значений или перед вызовом методов структуры. То есть, например, в следующем случае мы получим ошибку, так как обращение к полям и методам происходит до присвоения им начальных значений: 1 2 3 User tom; int x = tom.age; // Ошибка tom.DisplayInfo(); // Ошибка Также мы можем использовать для создания структуры конструктор без параметров, который есть в структуре по умолчанию и при вызове которого полям структуры будет присвоено значение по умолчанию (например, для числовых типов это число 0): 1 2 User tom = new User(); tom.DisplayInfo(); // Name: Age: 0 Обратите внимание, что при использовании конструктора по умолчанию нам не надо явным образом иницилизировать поля структуры. Также мы можем определить свои конструкторы. Например, изменим структуру User: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 using System; namespace HelloApp { struct User { public string name; public int age; public User(string name, int age) { this.name = name; this.age = age; } public void DisplayInfo() { Console.WriteLine($"Name: {name} Age: {age}"); } } class Program { static void Main(string[] args) { User tom = new User("Tom", 34); tom.DisplayInfo(); User bob = new User(); bob.DisplayInfo(); Console.ReadKey(); } } 33 } Важно учитывать, что если мы определяем конструктор в структуре, то он должен инициализировать все поля структуры, как в данном случае устанавливаются значения для переменных name и age. Также, как и для класса, можно использовать инициализатор для создания структуры: 1 User person = new User { name = "Sam", age = 31 }; Но в отличие от класса нельзя инициализировать поля структуры напрямую при их объявлении, например, следующим образом: 1 2 3 4 5 6 7 8 9 struct User { public string name = "Sam"; // ! Ошибка public int age = 23; // ! Ошибка public void DisplayInfo() { Console.WriteLine($"Name: {name} Age: {age}"); } } Практическая работа №12 Коллекции. Параметризованные классы Аннотация: Списки, очереди, двоичные массивы, хэш-таблицы, словари – все это коллекции. Существуют различные типы (классы) коллекций. Объект – представитель данного класса коллекции характеризуется множеством функциональных признаков, определяющих способы работы с элементами (неважно какого типа), которые образуют данную коллекцию Ключевые слова: пространство имен, IList, ICollection, BinarySearch, LastIndexOf, открытый метод, dequeue, enqueue, peek, интерфейс, вызов метода, значение, перечисление Обзор Пространство имен System.Collections содержит классы и интерфейсы, которые определяют различные коллекции объектов. Классы Класс Описание ArrayList Служит для реализации интерфейса IList с помощью массива с динамическим изменением размера по требованию BitArray Управляет компактным массивом двоичных значений, представленных логическими величинами, где значение true соответствует 1, а значение false соответствует 0 CaseInsensitiveComparer Проверяет равенство двух объектов без учета регистра строк CaseInsensitiveHashCodeProvider Предоставляет хэш-код объекта, используя алгоритм хэширования, при котором не учитывается регистр строк CollectionBase Предоставляет абстрактный (MustInherit в Visual Basic) базовый класс для коллекции со строгим типом Comparer Проверяет равенство двух объектов с учетом регистра строк DictionaryBase Предоставляет абстрактный (MustInherit в Visual Basic) базовый класс для коллекции пар "ключ-значение" со строгим типом Hashtable Предоставляет коллекцию пар "ключ-значение", которые упорядочены по хэш-коду ключа Queue Предоставляет коллекцию объектов, которая обслуживается по принципу "первым пришел — первым вышел" (FIFO) ReadOnlyCollectionBase Предоставляет абстрактный (MustInherit в Visual Basic) базовый класс для коллекции со строгим типом, которая доступна только для чтения SortedList Предоставляет коллекцию пар "ключ-значение", которые упорядочены по ключам. Доступ к парам можно получить по ключу и по индексу Stack Представляет коллекцию объектов, которая обслуживается по принципу "последним пришел — первым вышел" (LIFO) Интерфейсы Интерфейс Описание ICollection Определяет размер, перечислители и методы синхронизации для всех коллекций IComparer Предоставляет другим приложениям метод для сравнения двух объектов IDictionary Предоставляет коллекцию пар "ключ-значение" IDictionaryEnumerator Осуществляет нумерацию элементов словаря IEnumerable Предоставляет перечислитель, который поддерживает простое перемещение по коллекции IEnumerator Поддерживает простое перемещение по коллекции IHashCodeProvider Предоставляет хэш-код объекта, используя пользовательскую хэш-функцию IList Предоставляет коллекцию объектов, к которым можно получить доступ отдельно, по индексу Структуры Структура Описание DictionaryEntry Определяет в словаре пару "ключ-значение", которая может быть задана или получена Примеры ArrayList Неполный перечень свойств и методов приводится ниже. Конструктор ArrayList Перегружен. Инициализирует новый экземпляр класса ArrayList Свойства Capacity Возвращает или задает число элементов, которое может содержать класс ArrayList Count Возвращает число элементов, которое в действительности хранится в классе ArrayList IsFixedSize Возвращает значение, показывающее, имеет ли класс ArrayList фиксированный размер IsReadOnly Возвращает значение, определяющее, доступен ли класс ArrayList только для чтения IsSynchronized Возвращает значение, определяющее, является ли доступ к классу ArrayList синхронизированным (потокобезопасным) Item Возвращает или задает элемент с указанным индексом. В C# это свойство является индексатором класса ArrayList Методы Add Добавляет объект в конец класса ArrayList AddRange Добавляет элементы интерфейса ICollection в конец класса ArrayList BinarySearch Перегружен. Использует алгоритм двоичного поиска для нахождения определенного элемента в отсортированном классе ArrayList или в его части Clear Удаляет все элементы из класса ArrayList Clone Создает неполную копию класса ArrayList Contains Определяет, принадлежит ли элемент классу ArrayList CopyTo Перегружен. Копирует класс ArrayList или его часть в одномерный массив FixedSize Перегружен. Возвращает обертку списка фиксированного размера, в которой элементы можно изменять, но нельзя добавлять или удалять GetEnumerator Перегружен. Возвращает перечислитель, который может осуществлять просмотр всех элементов класса ArrayList GetRange Возвращает класс ArrayList, который представляет собой подмножество элементов в исходном классе ArrayList IndexOf Перегружен. Возвращает отсчитываемый от нуля индекс первого найденного элемента в классе ArrayList или в его части Insert Вставляет элемент в класс ArrayList по указанному индексу InsertRange Вставляет элементы коллекции в класс ArrayList по указанному индексу LastIndexOf Перегружен. Возвращает отсчитываемый от нуля индекс последнего найденного элемента в классе ArrayList или в его части Remove Удаляет первый найденный объект из класса ArrayList RemoveAt Удаляет элемент с указанным индексом из класса ArrayList RemoveRange Удаляет диапазон элементов из класса ArrayList Repeat Возвращает класс ArrayList, элементы которого являются копиями указанного значения Reverse Перегружен. Изменяет порядок элементов в классе ArrayList или в его части на обратный SetRange Копирует элементы коллекции в диапазон элементов класса ArrayList Sort Перегружен. Сортирует элементы в классе ArrayList или в его части ToArray Перегружен. Копирует элементы класса ArrayList в новый массив TrimToSize Задает значение емкости, равное действительному количеству элементов в классе ArrayList using System; using System.Collections; public class SamplesArrayList { public static void Main() { // Создается и инициализируется объект ArrayList. ArrayList myAL = new ArrayList(); myAL.Add("Россия,"); myAL.Add("вперед"); myAL.Add("!"); // Свойства и значения ArrayList. Console.WriteLine( "myAL" ); Console.WriteLine( "\tCount: {0}", myAL.Count ); Console.WriteLine( "\tCapacity: {0}", myAL.Capacity ); Console.Write( "\tValues:" ); PrintValues( myAL ); } public static void PrintValues( IEnumerable myList ) { // Для эффективной работы с объектом ArrayList // создается перечислитель... // Перечислитель обеспечивает перебор элементов. System.Collections.IEnumerator myEnumerator = myList.GetEnumerator(); // Перечислитель для myList while (myEnumerator.MoveNext()) Console.Write( "\t{0}", myEnumerator.Current ); } } Листинг 12.1. Результат: myAL Count: 3 Capacity: 16 Values: Россия , вперед ! BitArray Неполный перечень свойств и методов приводится ниже. Конструкторы BitArray Перегружен. Инициализирует новый экземпляр класса BitArray, для которого могут быть указаны емкость и начальные значения Открытые свойства Count Возвращает число элементов, которое хранится в классе BitArray IsReadOnly Возвращает значение, определяющее, доступен ли класс BitArray только для чтения IsSynchronized Возвращает значение, определяющее, является ли доступ к классу BitArray синхронизированным (потокобезопасным) Item Возвращает или задает значение бита по указанному адресу в классе BitArray В языке C# это свойство является индексатором класса BitArray Length Возвращает или задает число элементов в классе BitArray SyncRoot Возвращает объект, который может быть использован для синхронизации доступа к классу BitArray Открытые методы And Выполняет поразрядную операцию логического умножения элементов текущего класса BitArray с соответствующими элементами указанного класса BitArray Clone Создает неполную копию класса BitArray CopyTo Копирует целый класс BitArray в совместимый одномерный массив класса Array, начиная с указанного индекса конечного массива Get Возвращает значение бита по указанному адресу в классе BitArray GetEnumerator Возвращает перечислитель, который может осуществлять просмотр всех элементов класса BitArray Not Преобразовывает все двоичные значения в текущем классе BitArray таким образом, чтобы каждому элементу со значением true было присвоено значение false, а каждому элементу со значением false было присвоено значение true Or Выполняет поразрядную операцию логического сложения элементов текущего класса BitArray с соответствующими элементами указанного класса BitArray Set Задает указанное значение биту по указанному адресу в классе BitArray SetAll Задает определенное значение всем битам в классе BitArray Xor Выполняет поразрядную операцию "исключающее ИЛИ" для элементов текущего класса BitArray и соответствующих элементов указанного класса BitArray Пример использования: using System; using System.Collections; public class SamplesBitArray { public static void Main() { // Creates and initializes several BitArrays. BitArray myBA1 = new BitArray( 5 ); BitArray myBA2 = new BitArray( 5, false ); byte[] myBytes = new byte[5] { 1, 2, 3, 4, 5 }; BitArray myBA3 = new BitArray( myBytes ); bool[] myBools = new bool[5] { true, false, true, true, false }; BitArray myBA4 = new BitArray( myBools ); int[] myInts = new int[5] { 6, 7, 8, 9, 10 }; BitArray myBA5 = new BitArray( myInts ); // Displays the properties and values of the BitArrays. Console.WriteLine( "myBA1" ); Console.WriteLine( "\tCount: {0}", myBA1.Count ); Console.WriteLine( "\tLength: {0}", myBA1.Length ); Console.WriteLine( "\tValues:" ); PrintValues( myBA1, 8 ); Console.WriteLine( "myBA2" ); Console.WriteLine( "\tCount: {0}", myBA2.Count ); Console.WriteLine( "\tLength: {0}", myBA2.Length ); Console.WriteLine( "\tValues:" ); PrintValues( myBA2, 8 ); Console.WriteLine( "myBA3" ); Console.WriteLine( "\tCount: {0}", myBA3.Count ); Console.WriteLine( "\tLength: {0}", myBA3.Length ); Console.WriteLine( "\tValues:" ); PrintValues( myBA3, 8 ); Console.WriteLine( "myBA4" ); Console.WriteLine( "\tCount: {0}", myBA4.Count ); Console.WriteLine( "\tLength: {0}", myBA4.Length ); Console.WriteLine( "\tValues:" ); PrintValues( myBA4, 8 ); Console.WriteLine( "myBA5" ); Console.WriteLine( "\tCount: {0}", myBA5.Count ); Console.WriteLine( "\tLength: {0}", myBA5.Length ); Console.WriteLine( "\tValues:" ); PrintValues( myBA5, 8 ); } public static void PrintValues( IEnumerable myList, int myWidth ) { System.Collections.IEnumerator myEnumerator = myList.GetEnumerator(); int i = myWidth; while ( myEnumerator.MoveNext() ) { if ( i <= 0 ) { i = myWidth; Console.WriteLine(); } i--; Console.Write( "\t{0}", myEnumerator.Current ); } Console.WriteLine(); } } Листинг 12.2. Результат: myBA1 Count: 5 Length: 5 Values: False False False False False myBA2 Count: 5 Length: 5 Values: False False False False False myBA3 Count: 40 Length: 40 Values: True False False False False False False False False True False False False False False False True True False False False False False False False False True False False False False False True False True False False False False False myBA4 Count: 5 Length: 5 Values: True False True True False myBA5 Count: 160 Length: 160 Values: False True True False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True False False False False False False False False False False False False False False False False False False False False False False False False False False False False True False False True False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True False True False False False False False False False False False False False False False False False False False False False False False False False False False False False False Листинг 12.3. Queue Неполный перечень свойств и методов. Конструктор Queue Перегружен. Инициализирует новый экземпляр класса Queue Открытые свойства Count Возвращает число элементов, которое хранится в классе Queue SyncRoot Получает объект, который может быть использован для синхронизации доступа к классу Queue Открытые методы Clear Удаляет все объекты из класса Queue Clone Создает поверхностную копию класса Queue Contains Определяет, принадлежит ли элемент классу Queue CopyTo Копирует элементы класса Queue в существующий одномерный массив класса Array по указанному адресу Dequeue Удаляет и возвращает объект в начале класса Queue Enqueue Добавляет объект в конец класса Queue GetEnumerator Возвращает перечислитель, который может перемещаться по классу Queue Peek Возвращает объект в начале класса Queue, но не удаляет его ToArray Копирует элементы класса Queue в новый массив TrimToSize Задает значение емкости, равное действительному количеству элементов в классе Queue Пример: using System; using System.Collections; public class SamplesQueue { public static void Main() { // Creates and initializes a new Queue. Queue myQ = new Queue(); myQ.Enqueue("Россия,"); myQ.Enqueue("вперед"); myQ.Enqueue("!"); // Displays the properties and values of the Queue. Console.WriteLine( "myQ" ); Console.WriteLine( "\tCount: {0}", myQ.Count ); Console.Write( "\tValues:" ); PrintValues( myQ ); } public static void PrintValues( IEnumerable myCollection ) { |