Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры С# 2.doc
Скачиваний:
23
Добавлен:
22.09.2019
Размер:
266.75 Кб
Скачать

7.Массивы в с#. Класс Systen.Random и System.Array.

В С# массивы реализованы как объекты. Тип массив определён в системном типе System. Array. Массив – это набор эл-тов данных одного типа, сохранённых в непрер-й об-сти памяти. Массив сод. список ссылок на ячейки памяти, в кот. сохранены эл-ты массива. Массив может быть объявлен с указанием любого типа данных.

Индексация с объявлением одномерного массива:

тип [ ] (обозн., что определятся одном. массив) имя_массива = new тип [размер]; т.к. массивы определяются как объекты, их создание представл. собой двухступенчатый пр-с. Сначала объявляется ссылочная переменная на массив, а затем для него выдел. память, и переменной массива присваивается ссылка (адрес) на эту область памяти.

В С# размер массива не нужно указывать при его объявлении. Этим достигается большая гибкость, размер опред. в тот момент, когда массив будет использоваться.

Создание массива: int [ ] mas = new int [15]; (читаем с хвоста, сколько памяти объекту массива).

Т.к. массивы предст. собой ссылки, для созд-я объекта массива типа int обязат. Ключ. слово new. Такая строка позволяет инициализировать и заполнить его значениями по умолчанию (0, у нас).

Инициализация массива выполняется с помощью ключевого слова new.

string mas_str; // образован массив

Можно инициализировать массив при объявлении сокращённым методом:

int [ ] mas = {10, 50, -40, 80}; // В таком случае new не указывается.

Типы массивов. В зависимости от числа данных измерений массивы делятся на: - одномерные; - многомерные; - ступенчатые.

Пример:

class Usearray

{ static void Main() { int i,n;

Console. WriteLine(“Сколько данных хотите ввести?”)

n = Int32. Parse(Console.ReadLine());

int [ ] mas = new int [n];

for (i = 0; i < n; i ++)

{ Console. WriteLine(“Enter mas [” + i + “] ”); mas [i] = Int32.Parse(Console.ReadLine()); }

Console. WriteLine(“Создан массив:”);

for (i = 0; i < n; i + +)

{ Console. Write(“ {0}”,mas[i]); } } }

Выход за границы массива проверяется, при этом генерируется исключение IndexOut of Range Exception.

Многомерные массивы.

Массивы в С# могут быть объявлены с любым кол-вом измерений. Рассм. простейший многом. массив – двумерный или прямоугольный. При объявлении в [ ] через запятую указывается размер массива для каждого измерения. Объявим, например, матрицу 1020 целых чисел:

int [,] Matrix = new int[10,20]; // Создаётся ссылочная переменная двухмерного массива

Пример: заполняем матрицу 34 числами от 1 до 12

using System; Class Dwumas

{ public static void Main() { int i, j; int [,] Matr = new int [3,4];

for (i = 0; i < 3; i + +) { for (j = 0; j < 4; j ++) { Matr [i,j] = (i*4) + j + 1;

Console. Write(Matr [i,j] + “ ”); } Console. WriteLine(); }

Инициализация двухмерного массива при его создании.

Список инициализаторов каждой строки нужно заключать в свои фигурные скобки.

int [3,4] Matr2 = { {10, 20, 30, 40}, {-10, -20, -30, -40}, {50, 60, 70, 80} };

Альтернативный способ доступа к элементам массива – цикл foreach.

Пример использования foreach для вывода элементов массива:

using System; class use mas { static void Main() {

Console. WriteLine(“Сколько чисел вы хотите ввести”);

int n = int32. Parse(Console. ReadLine());

int [ ] Mas = new int [n]; for (int k = 0; k < n; k + +)

{ Console. WriteLine(“Введите число”);

Mas [k] = int32.Parse(Console. ReadLine()); }

foreach(int z in Mas) Console. WriteLine(“Это число {0}”, z); } }

Массивом наз. упорядоченную совок-сть эл-тов одного типа. Каждый эл-т массива имеет индексы, определяющие порядок эл-тов. Число индексов хар-ет размерность массива. Каждый индекс измен. в некот. диапазоне [a,b]. Диапазон [a,b] наз. граничной парой, a - нижней границей, b - верхней границей индекса. При объявлении массива границы задаются выражениями. Если все границы заданы константными выражениями, то число эл-тов массива известно в момент его объявления и ему может быть выделена память еще на этапе трансляции. Такие массивы наз. статическими. Если же выражения, задающие границы, зависят от переменных, то такие массивы наз. Динамическими. Массиву выделяется непрерывная обл. памяти. Объявление одномерных массивов

Общая стр-ра объявления: [<атрибуты>] [<модификаторы>] <тип> <объявители>; Объявление одном. массива: <тип>[] <объявители>; Квадр. скобки приписаны не к имени перем., а к типу. Запись T[] следует понимать как класс одномерный массив с эл-ми типа T. Пример объявления трех массивов с отложенной инициализацией: int[] a, b, c; Инициализация явл. явной и задается константным массивом: double[] x= {5.5, 6.6, 7.7}; Эл-ты константного массива следует закл. в фигурные скобки. Создание и инициализация массива вып. в объектном стиле с вызовом конструктора массива: int[] d= new int[5];

Класс Random и его ф-ции Умение генерировать случайные числа требуется во многих приложениях. Класс Random содержит все необход. для этого средства. Класс Random имеет конструктор класса: для того, чтобы вызывать методы класса, нужно вначале создавать экземпляр класса. Класс Random явл. наследником класса Object. Рассм. только оригинальные методы класса Random со статусом public, необходимые для генерирования последоват-стей случ. чисел. Класс имеет защищенные методы. Перегруженный метод public int Next() при каждом вызове возвращает положит. целое, равном. распределенное в некот. диапазоне. Диапазон задается параметрами метода. Три реализации метода:

  • public int Next () - метод без параметров выдает целые положит. числа во всем положительном диапазоне типа int;

  • public int Next (int max) - выдает целые положит. числа в диапазоне [0,max];

  • public int Next (int min, int max) - выдает целые положит. числа в диапазоне [min,max].

Метод public double NextDouble () имеет одну реализацию. При каждом вызове этого метода выдается новое случайное число, равномерно распределенное в интервале [0,1). Метод,кот.позволяет при одном обращении получать целую серию случ. чисел. Метод описан как public void NextBytes (byte[] buffer). Т.к. параметр buffer представляет массив байтов, то, естественно, генерированные случайные числа находятся в диапазоне [0, 255].

Класс Array . Нельзя понять многие детали работы с массивами в C#, если не знать устройство класса Array из библиотеки FCL, потомками которого являются все классы-массивы. Рассмотрим следующие объявления:

//Класс Array int[] ar1 = new int[5]; double[] ar2 ={5.5, 6.6, 7.7}; int[,] ar3 = new Int32[3,4]; У всех классов, явл-ся массивами, много общего, поскольку все они явл. потомками класса System.Array. Класс System.Array наследует ряд интерфейсов: ICloneable, IList, ICollection, IEnumerable, а, следовательно, обязан реализовать все их методы и св-ва. Класс Array имеет большое число собств. методов и св-в.

8. Структуры в С#, создание структуры. Стр-ры, как и классы, исп-тся как контейнерные объекты для многих видов объектов данных. Они могут реализовывать конструктуры, константы, поля, св-ва, индексаторы, операторы и вложенные типы, т. е. стр-ры поддерживают все возм-сти, кот. реализуются с помощью классов Но классы явл. ссылочными типами и поэтому только ссылаются на данные, кот. в них хранятся. Стр-ры хранят действит. значения. Память для структур выделяется в стеке. Доступ к стр-рам осущ-ся быстрее, чем классам. Стр-ры могут реализовывать интерфейсы. Объявление стр-ры с помощью слова struct. [<атрибут> <модификатор> struct <идентификатор>: <интерфейс> <тело структуры>;] Все базовые типы в С# в осн. Явл. типами структур (sbyte, int, long. Стр-ры инициализируются только с помощью вызова конструктора. Стр-ры не поддерживают наследования. Структура - это частный случай класса. Синтаксис структур. Синтаксис объявления структуры аналогичен синтаксису объявления класса: [атрибуты][модификаторы]struct имя_структуры[:список_интерфейсов] {тело_структуры}

using System; Class uses Struct { struct point { public double x,y;

public point (double x, double y) { this.x = x; this.y = y; } } static void Main ()

{ point [ ] pt = new point [5]; … for (int i = 0; i < 5; i + +) { pt [i] = new point (i, i+2); Console. Writeline (“{0}”, i); Console. Writeline (“Значение x = {0}”, pt [i].x); Console. Writeline (“Значение y = {0}”, pt [i].y); }}}

9.Понятие ООП. ООП предн.для написания сложных систем. Ограничения на возможность создания больших систем накладывало разобщенность в прогр-ме данных и методов их обработки. Возн.потребность разделить прогр.на полностью независ.и сам.классы процедур, кот.сами отвечают за свое внутр.состояние и внешн.поведение. Объект — это всего лишь совокупность взаимосвязанных данных и средств исполнения. Объект складывается из данных, описывающих объект, и операций, которые могут с ним выполняться. Объекты обладают след.хар-ми: имеют набор св-в, совок-сть св-в объекта опред.его состояние; объекты способны разными методами изменять свои св-ва; методы способны реагировать на события, Событие – ср-во взаимод.объектов др.с др. Планирование класса: надо определить какие действия должен выполнять объект класса, что должен содержать класс для выполнения действий, разраб.методы, кот.реализуют действия, присущие объектам этого класса. Наследование. Под этим термином понимается возм-сть передачи данных и ср-в исполнения от родит. объекта. Исптся уже готовый объект и дополняется теми чертами, кот. необходимы. Родительский объект наз. базовым классом (base class), а объект-потомок — производным классом (derived class). Если произв.класс наслед.от одного базового класса, то это единичное наслед-е, если отнеск.-множеств. Включение. Включ. (containment), также называемое агрегированием (aggregation). Объект уже не явл. уточненной версией др. объекта, а содержит в себе этот объект. Т.о. класс уже не имитирует поведение строки, а содержит внутреннюю строку (массив, хэш-таблицу и т. д.). Полиморфизм и виртуальные функции. Абстрактный класс (abstract class), то есть класс, ф-ции кот. должны быть реализованы в производном классе и кот. иногда содержит ф-ции, используемые несколькими потомками. Инкапсуляция и видимость. При проектировании объектов программист должен решить, какие части объекта должны быть доступны для пользователя, а какие следует изолировать в объекте. Детали класса, остающиеся невидимыми для пользователя, называются инкапсулированными (encapsulated) в классе.

10. Классы в С#. В С# все прогр-мы оформл.в виде классов. Класс созд.с пом.ключ.слова class, а в студии Project>Add class. Класс сод.члены-перем., кот.описывают данные об объекте; методы, кот.реализуют действия над объектом, св-ва, с пом.кот.происх. доступ к членам-перем., индексаторы, кот.позвол. работать с объектом как с эл-том массива. Объявление простого класса,кот.сод. только члены-перем. И методы: Class имя_класса { //определение членов-перем. Доступ, тип, имя переем.1-й; ….. //объявление методов Доступ, тип возвр.значения Имя_метода 1-го (список парам.) { //тело метода} метод 2…..}

Доступ означает спецификатор доступа public (общий, открытый), private (частный, закрытый), protected (защищенный), interna (при использовании компановочных файлов). Методы класса могут быть параметризованы,т.е.иметь параметры. Метод может возвращать какие-то данные по умолчанию, если перед парам.не указаны модификаторы ref и out и тип возвращ.значения не void, метод возвращает только одно значение. Для этого метод должен зак.словом return выражение; Можно создавать методы, кот.ничего не возвращ. Тип возврата у них void (неопред.) – для ввода значений. После того, как класс собран, в ф-ции Main() можно обратиться к методам класса, если класс не статический. Напр. Natur_chisla Ob=new Natur_chisla. В этой строке происх.создание класса Ob или ссылочной перем.Ob. эта переем.не определяет объект, а может лишь ссылаться на него. Оператор new динамически выделяет память для объекта и возвращает ссылку на него. Ссылка – адрес начала области памяти, занимаемой объектом.

11. типы значений и ссылочные типы. Упаковка и распаковка. Все типы в С3 раздел.на 2 вида: структ.или типы значений, ссылочные. К структ.типам отн.все числовые типы данных (int, double…), логич.тип bool и др. при присвоении одного структ.типа другому присв.не сам тип, а его побитовая копия. Выполнение операции со структ.типами происходят быстрее, чем при исп-нии ссылочных типов,т.к. память для структ.типов выдел.из стека. Стек рецензируется в оперативной памяти для врем.хранения данных, пока работает пр-ма. Схема LIFO: последним пришел- первым обсл. Для организации стека компилятор созд.указатель, кот.снач.содержит адрес дна стека, а затем при заполнении стека указывает адрес своб.памяти над последним заполненным участком. Ссылочные типы хранят лишь ссылки на действит.данные. имя массива-адрес 1-го эл-та массива. Память выдел.не в стеке, а в обл.управляемой кучи. Среда CLR резервирует кучу как непрерывный диапазон адресов памяти. При копировании ссылочного типа создается еще одна ссылка, кот.будет указывать на одну и ту же обл.памяти. от структ.типа можно перейти к ссылочному с пом.мех-ма – упаковка. Происх.след: в управляемой куче созд.нов.обект Ob и в него копир-ся значение X и стек Ob будет содержать ссылку на эту память в куче. Противоположная операция, т.е. преобразов.ссылки на объект обратно в структ.тип наз.распаковкой. Перед выполнением распаковки среда CLR проверяет совместимость типа объекта и структ.типа, в кот.будет производиться распаковка. В большинстве случаев компилятор С# выполн.упак./распак. автомат.

12. Конструкторы и деструкторы. Сборка «мусора». Конструктор представляет собой спец. метод класса, позвол. создавать объекты класса. Имя констр.должно совпадать с именем класса. Если программист не определяет конструктор класса, то к классу автомат. добавляется конструктор по умолчанию - конструктор без аргументов. Конструкторы в одном классе перегружены. Перегрузка означает одно и тоже имя, но разный список параметра. Перегрузка – один из мех-мов реализации полиморфизма. Формат записи констр.: спецификатор доступа Имя констр. (класс)(список параметров){ //тело констр. } В качестве модификатора доступа исп.Public. Можно не создавать констр.,тогда компилятор автом.создаст констр.по умолчанию без парам. Констр., им-щие парам., наз.параметризованными. Парам.нужны для инициализации экземпляра класса в мом.его создания. Деструкторы класса. Деструктор – спец.метод, кот.вызыв. перед тем,как объект оконч.будет разрушен сис-мой сбора мусора. Он исп.для освоб.памяти, выделенной экземпляру класса. Формат записи: ~Person() { //Код деструктора } Он вызыв.в мом., предшеств.утилизации объекта. Хар-ка дестр.: 1, имя совп.с именем класса; 2. Для дестр.неявно установлен спецификатор доступа public; 3. Дестр-ру нельзя передавать аргументы, поэтому в классе должен быть только один дестр. 4. Как и у статич. констр-ра, у дестр-ра не указывается модификатор доступа. Сборка мусора. После генерации маш.кода прогр.код вып.на опред.платформе. На этом этапе осущ.очень важное действие – сборка мусора. В сит.,когда после использ.памяти, выделенной для ресурса, она не освоб.,работа приложения становится нестабильной. Разраб.спец. пр-ма – СБОРЩИК МУСОРА, он явл.одним из компонентов среды выполнения CLR. Осн.пробл. сборщика мусора – невозм.точно предсказать, когда сборщик освободит память. В рез.могут возн.ситуации, когда дестр.вообще не будет вызван. => не стоит освоб.память с пом.дестр.

13.Определение пользовательских методов класса. Модификаторы доступа к методам класса. Модификаторы параметров методов класса . this – специальная переменная, которая доступна во всех методах класса, //в том числе и в конструкторах. This всегда ссылается на текущий экземпляр. Методы Get_x и Get_y служат для обращения к закрытым переменным класса. В C# для доступа к закрытым переменным используются свойства. Они сочетают в себе методы get и set. Как происходит передача аргументов методу класса ? Изменения, внес. в параметры метода, не влияют на аргументы, используемые при вызове, сканировались. Первый способ передачи аргумента - вызов по значению (call-by-value). При передаче методу значения не ссылочного типа происх. вызов по значению. Для получения доступа к реальному аргументу, заданному при вызове, исп. ссылка на аргумент. Второй способ передачи аргумента наз. вызовом по ссылке (cale-by-reference). Изменения, внес. в параметр, воздействуют на аргумент, исп-мый при вызове метода. Объекты передаются методу путем вызова по ссылке. Если не ссылочный параметр передается методу по значению, то, изменяя параметр, мы не влияем на реальный аргумент. Модификаторы ref, out и params для пар-ров методов. Мод-тор ref пишут и перед параметром в методе, и перед аргументом в вызове метода. Аргументу, передаваемому методу со словом ref, должно быть присвоено значение до вызова метода. Ведь параметр должен ссылаться на действит. значение. Ref обычно прим. для того, чтобы метод внес изменения в сущ-щие. Параметры out работают точно так же, как и параметры ref, но в них разрешается передавать не инициализируемые переменные. Но чаще всего, модификатор out исп-ся не для передачи значения методу, а для его получения из метода. Не нужно тогда переменной (аргументу со словом out) присваивать начальное значение до вызова метода. Примечание: Метод (до своего завершения) обязательно должен присвоить out-параметру значение. Модификаторы ref и out можно применять и к ссылочным параметрам, т.е параметрам-объектам. В этом случае реал-ся передача ссылки по ссылке. Это позволяет методу изменять объект, на кот. указывает ссылка-параметр. Использование переменного количества аргументов и модификатор params. Иногда нужен метод, который принимал бы произвольное число аргументов. Например, метод, который находит максимальное значение в наборе чисел. Методу может быть передано 2, 3, 4 и т.д значения. Такому методу нужен специальный параметр, который заменяет собой произвольное количество параметров. Это реализуется с помощью модификатора params. Модификатор params используется для объявления параметра массива, который сможет получить некоторое количество аргументов (в том числе и нулевое). Количество элементов в массиве будет равно числу аргументов, переданных методу. Примечание: В любом методе может быть только один модификатор params. Параметр с модификатором params может быть только последним параметром в списке параметров метода.

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