Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ShPOR.docx
Скачиваний:
37
Добавлен:
23.04.2019
Размер:
93.52 Кб
Скачать

5. Концепция типа данных. Составные типы данных. Массивы и их реализация в с#. Структуры.

Массив (array) — это коллекция переменных одинакового типа, обращение к которым происходит с использованием общего для всех имени. В С# массивы могут быть одномерными или многомерными. Массивы представляют собой удобное средство группирования связанных переменных. Например, массив можно использовать для хранения значений максимальных дневных температур за месяц, списка цен на акции или названий книг по программированию из домашней библиотеки.

Массив организует данные таким способом, который позволяет легко ими манипулировать. Кроме того, организация данных в форме массива позволяет легко их сортировать в нужном направлении. С#-массивы реализованы как объекты. Реализация массивов в виде объектов позволила получить ряд преимуществ, причем одно из них состоит в том, что неиспользуемые массивы могут автоматически утилизироваться системой сбора мусора.

(5)

Одномерный массив — это список связанных переменных. Для объявления одномерного массива используется следующая форма записи.

тип[] имя__массива = new тип [размер] ;

Поскольку массивы реализуются как объекты, их создание представляет собой двухступенчатый процесс. Сначала объявляется ссылочная переменная на массив, а затем для него выделяется память, и переменной массива присваивается ссылка на эту область памяти. Таким образом, в С# массивы динамически размещаются в памяти с помощью оператора new.

Рассмотрим пример: int [ ] sample = new int [10];

Доступ к отдельному элементу массива осуществляется посредством индекса. Индекс описывает позицию элемента внутри массива. В С# первый элемент массива имеет нулевой индекс. Многомерным называется такой массив, который характеризуется двумя или более измерениями, а доступ к отдельному элементу осуществляется посредством двух или более индексов. Вот как объявляется многомерный массив:

ТИП [ , .. , ] имя = new тип [размер1, ... , размерN] ;

Например, с помощью следующего объявления создается трехмерный целочисленный массив размером 4x10x3: int [, ,] multidim = new int [ 4 , 10, 3];

Чтобы присвоить число 100 элементу массива multidim, занимающему позицию с координатами 2,4,1, используйте такую инструкцию: multidim [2, 4, 1] = 100;.

Однако С# позволяет создавать двумерный массив специального типа, именуемый рваным, или с рваными краями. У такого массива строки могут иметь различную длину. Следовательно, рваный массив можно использовать для создания таблицы со строками разной длины. Рваные массивы объявляются с помощью наборов квадратных скобок, обозначающих размерности массива. Например, чтобы объявить двумерный рваный массив, используется следующий формат записи: ТИП [] [] имя = new тип [размер][];

Здесь элемент размер означает количество строк в массиве. Для самих строк память выделяется индивидуально, что позволяет строкам иметь разную длину. Например, следующий фрагмент программы при объявлении массива jagged выделяет память для его первой размерности, а память для его второй размерности выделяется "вручную".

int [ ] [ ] jagged = new int [ 3 ] [ ] ;

jagged [0] = new int [ 4 ] ; jagged[1] = new int [ 3 ] ; jagged[2] = new int [ 5 ] ;

Доступ к элементу осуществляется посредством задания индекса внутри собственного набора квадратных скобок. Например, чтобы присвоить число 10 элементу массива jagged с координатами 2 и 1, используйте такую инструкцию: jagged[2][1] = 10;

Структуры

Классы — это ссылочные типы. Это означает, что к объектам классов доступ осуществляется через ссылку. Этим они отличаются от типов значений, к которым в С# реализован прямой доступ. Но иногда желательно получать прямой доступ и к объектам, как в случае нессылочных типов. Одна из причин для этого — эффективность. Ведь очевидно, что доступ к объектам классов через ссылки увеличивает расходы системных ресурсов, в том числе и памяти. Даже для очень маленьких объектов требуются существенные объемы памяти. Для компенсации упомянутых расходов времени и пространства в С# предусмотрены структуры. Структура подобна классу, но она относится к типу значений, а не к ссылочным типам. Формат записи структуры таков: struct имя : интерфейсы { // объявление членов}

Все, что может быть вложено в тело класса, может быть вложено и в тело структуры: поля, методы, конструкторы и прочее, включая классы и интерфейсы. Структуры не могут наследовать другие классы или структуры. Структуры могут также определять конструкторы, но не деструкторы. Однако для структуры нельзя определить конструктор по умолчанию (без параметров). Дело в том, что конструктор по умолчанию автоматически определяется для всех структур, и его изменить нельзя. Поскольку структуры не поддерживают наследования, члены структуры нельзя определять с использованием модификаторов abstract, virtual или protected. Если при объявлении класса его поля можно инициализировать, что найдет отражение при работе конструктора класса, то поля структуры не могут быть инициализированы. В конструкторе нельзя вызывать методы класса. Поля структуры должны быть проинициализированы до вызова методов.

Book bookl = new Book("Herb Schildt", "C# A Beginner's Guide", 2001);

Book book2 = new Book(); // Вызов конструктора по умолчанию.

Book Bоок3; // Создание объекта без вызова конструктора.

book2.title = "Brave New World"; book2.author = "Aldous Huxley"; book2.copyright = 1932;

Bоок3.title = "Red Storm Rising";

Как видно из результатов выполнения этой программы, структура может быть создана либо с помощью оператора new, который вызывает соответствующий конструктор, либо простым объявлением объекта.

6. Концепция типа данных. Явное и неявное преобразование типов.

В C# преобразования делятся на неявные и явные. К неявным относятся те преобразования, результат выполнения которых всегда успешен и не приводит к потере точности данных. Неявные преобразования выполняются автоматически. Для арифметических данных это означает, что в неявных преобразованиях диапазон типа назначения содержит в себе диапазон исходного типа. Например, преобразование из типа byte в тип int относится к неявным, поскольку диапазон типа byte является подмножеством диапазона int. Это преобразование всегда успешно и не может приводить к потере точности. Заметьте, преобразования из целочисленных типов к типам с плавающей точкой относятся к неявным. Хотя здесь и может происходить некоторое искажение значения, но точность представления значения сохраняется, например, при преобразовании из long в double порядок значения остается неизменным.

К явным относятся разрешенные преобразования, успех выполнения которых не гарантируется или может приводить к потере точности. Такие потенциально опасные преобразования должны быть явно заданы программистом. Преобразование из типа int в тип byte относится к явным, поскольку оно небезопасно и может приводить к потере значащих цифр. Заметьте, не для всех типов существуют явные преобразования. В этом случае требуются другие механизмы преобразования типов, которые будут рассмотрены позже.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]