Введение в классы и объекты. Передача параметров в методы

Содержание

Слайд 2

C#. Классы и объекты Описание класса: [ Модификатор доступа ] class

C#. Классы и объекты

Описание класса:
[ Модификатор доступа ] class

ИмяКласса [ : System.Object]
{ // члены класса – поля и методы
Модификатор доступа Тип имяПоля [ = значение ];
Модификатор доступа Тип имяМетода (Параметры) {
// тело метода }
}
Модификаторы доступа и доступ для членов класса:
public – общий (неограниченный) доступ;
protected – доступ ограничен в пределах данного класса и классов, производных от данного;
internal - доступ ограничен сборкой, в которой находится данный класс;
protected internal - доступ ограничен в пределах данного класса и классов, производных от данного, или - доступ ограничен сборкой, в которой находится данный класс;
private - доступ ограничен в пределах данного класса;
Доступом по умолчанию для членов класса является private
Слайд 3

C#. Классы и объекты Класс – это конструкция языка программирования, которая

C#. Классы и объекты

Класс – это конструкция языка программирования, которая

объединяет в себе переменные и функции (методы), которая может определять новый тип данных, который можно использовать для создания объектов этого типа.
В C# как и в Java объявление класса совмещено с его определением, то есть методы класса нужно реализовывать (писать код тела) сразу же при их описании. Поля класса могут инициализироваться при объявлении.
Модификаторы доступа - это ключевые слова, которые определяют доступность класса или его членов.
В языке C# предусмотрены следующие модификаторы доступа: public, protected, internal, protected internal, private.
Для членов класса (полей и методов) разрешено использование всех указанных выше модификаторов.
Модификатор доступа должен появляться перед каждым отдельным полем или методом (иначе данный элемент будет иметь уровень доступа private).
Поля и методы класса, помеченные как public,  доступны через объект по имени из классов текущей сборки и из классов других сборок (если класс имеет уровень доступа public).
Поля и методы класса, помеченные как protected, доступны по имени только из методов своего класса и классов потомков.
Поля и методы класса, помеченные как protected internal, доступны по имени только из методов своего класса и классов потомков, а также доступны через объект по имени для любого класса текущей сборки.
Private-поля и private методы доступны по имени только из методов своего класса.
Поля и методы класса, помеченные как internal, доступны по имени только из методов своего класса и классов потомков текущей сборки, а также доступны через объект по имени для любого класса текущей сборки.
Доступ для классов верхнего уровня (классов, не вложенных в другие классы) ограничивается модификаторами internal и public (мо умолчанию – internal).
Слайд 4

C#. Классы и объекты Создание объектов: ИмяКласса имяОбъекта; // объявление ссылки

C#. Классы и объекты
Создание объектов:
ИмяКласса имяОбъекта; // объявление ссылки

на объект
имяОбъекта = new ИмяКласса([ параметры конструктора]);
Доступ к полям и методам объекта:
имяОбъекта.имяПоля = значение;
ИмяОбъекта.имяМетода(параметры);
Варианты конструкторов:
Конструкторы с параметрами;
Конструкторы без параметров (конструкторы по умолчанию).
Специальная ссылка this
Слайд 5

C#. Классы и объекты Объект в С# как и в Java

C#. Классы и объекты

Объект в С# как и в Java

– это экземпляр класса. Класс как и в Java так и в С# является ссылочным типом данных, поэтому механизм создания объектов одинаков:
Создается ссылочная переменная в стеке для хранения адреса будущего объекта;
В динамической памяти (куче) выделяется пространство для размещения объекта со всеми его полями;
Поля объекта инициализируются значениями по умолчанию;
Выполняется явная инициализация полей объекта, если она была задана программистом;
Выполняется конструктор;
Ссылка на созданный объект (его адрес) записывается в соответствующую ссылочную переменную.
В С# доступ к элементам объекта вне класса, которому принадлежит объект, такой же как и в Java - используется операция «точка» после переменной-ссылки на объект, если конечно этот доступ разрешен модификаторами доступа. Если элементы объекта имеют модификатор доступа private, то доступ к ним осуществляется через public-методы.
Идеология конструкторов в С# мало чем отличается от конструкторов в С++ и Java. Конструктор – это метод, имя которого совпадает с именем класса и который вызывается автоматически при создании объекта. Типы конструкторов в С# те же что и в Java: конструкторы с параметрами и конструкторы без параметров (конструкторы по умолчанию).
Ссылка this – это скрытый параметр метода, который хранит ссылку на текущий объект, который вызывает метод.
Как и в Java в С# уничтожение неиспользуемых объектов осуществляется автоматически «сборщиком мусора», специальным механизмом CLR. В C# можно создать метод вида ~имя_класса(), который полностью аналогичен методу finalize() в Java, то есть является завершителем, который вызывается механизмом CLR перед уничтожением объекта. В С# метод вида ~имя_класса() также называют деструктором.
Слайд 6

C#. Классы и объекты Пример 1:

C#. Классы и объекты

Пример 1:

Слайд 7

C#. Классы и объекты Пример 1:

C#. Классы и объекты

Пример 1:

Слайд 8

C#. Статические поля и методы Пример

C#. Статические поля и методы

Пример

Слайд 9

C#. Статические поля и методы Назначение статических полей класса и статических

C#. Статические поля и методы

Назначение статических полей класса и статических

методов одинаковое и в С++ и в Java и в C#.
Статические поля класса - это поля, значения которых для каждого экземпляра класса (объекта) одинаковы (создаются статические поля отдельно от создания объекта), а статические методы предназначены для работы со статическими полями. Статический метод ссылку this не получает и поэтому обращаться к нестатическим членам класса не может. Для доступа к обычному члену класса необходимо создать объект класса, а для доступа к статическому элементу можно воспользоваться именем класса.
Так как в C# и в Java отсутствуют глобальные переменные и константы, то все объявления должны находиться внутри классов. В результате часто образуются классы, состоящие исключительно из статических членов. Необходимость в создании экземпляров у таких классов полностью отсутствует, так как статические поля и методы можно вызвать через имя класса. Чтобы запретить создание экземпляров данного класса создают закрытый конструктор (см. пример на слайде). 
Слайд 10

С#. Передача параметров в методы Описание метода: Модификатор доступа Тип_возврата имяМетода

С#. Передача параметров в методы

Описание метода:
Модификатор доступа Тип_возврата имяМетода

(Формальные параметры)
{ /* тело метода */ }
Вызов метода:
имяОбъекта . имяМетода (Фактические параметры)
Способы передачи параметров:
по значению;
по ссылке (по адресу).
Разновидности формальных и фактических параметров:
входные параметры (параметры – значения);
выходные параметры (объявляются с ключевым словом out);
ссылочные параметры (объявляются с ключевым словом ref).
Слайд 11

С#. Передача параметров в методы В С# существует два способа передачи

С#. Передача параметров в методы

В С# существует два способа передачи

параметров: по значению и по ссылке.
При передаче параметров по значению - значения фактических параметров копируются в соответствующие формальные параметры. Изменение формального параметра не влияет на значение фактического параметра. При передаче ссылок на объекты копируется ссылка (адрес объекта). После такого копирования, и фактический параметр, и формальный параметр, ссылаются на один и тот же объект.
При передаче параметров по ссылке - адреса фактических параметров копируются в соответствующие формальные параметры и по этим адресам есть доступ к значениям фактических параметров и их можно изменить.
В С# передача параметров по ссылке реализуется с помощью ссылочных параметров (ref – параметров) и выходных параметров (out – параметров).
Разница между ref и out в том, что переменную, переданную через out вы обязаны проинициализировать в методе, куда она передается.
Слайд 12

C#. Передача параметров в методы Пример 2. Параметры-значения Вариант 1

C#. Передача параметров в методы

Пример 2. Параметры-значения
Вариант 1

Слайд 13

C#. Передача параметров в методы Пример 2. Параметры - ссылки Вариант 2

C#. Передача параметров в методы

Пример 2. Параметры - ссылки
Вариант 2

Слайд 14

C#. Передача параметров в методы Пример 3. Массив в качестве параметра и возвращаемого значения

C#. Передача параметров в методы

Пример 3. Массив в качестве параметра

и возвращаемого значения
Слайд 15

C#. Передача параметров в методы Пример 3. Массив в качестве параметра и возвращаемого значения

C#. Передача параметров в методы

Пример 3. Массив в качестве параметра

и возвращаемого значения
Слайд 16

C#. Передача параметров в методы Пример 4. Массив в качестве параметра

C#. Передача параметров в методы

Пример 4. Массив в качестве параметра

Слайд 17

C#. Передача параметров в методы Пример 4. Массив в качестве параметра

C#. Передача параметров в методы

Пример 4. Массив в качестве параметра


Слайд 18

С#. Передача параметров в методы Пример 5. Возврат двух значений из метода. Выходные параметры

С#. Передача параметров в методы

Пример 5. Возврат двух значений из

метода. Выходные параметры
Слайд 19

C#. Передача параметров в методы Пример 5. Возврат двух значений из метода. Выходные параметры

C#. Передача параметров в методы

Пример 5. Возврат двух значений из

метода. Выходные параметры
Слайд 20

C#. Массивы объектов. Интерфейс IComparable Пример 6. Сортировка массива объектов

C#. Массивы объектов. Интерфейс IComparable

Пример 6. Сортировка массива объектов

Слайд 21

C#. Массивы объектов. Интерфейс IComparable Пример 6. Сортировка массива объектов

C#. Массивы объектов. Интерфейс IComparable

Пример 6. Сортировка массива объектов

Слайд 22

C#. Массивы объектов. Интерфейс IComparer Пример 7. Сортировка массива объектов

C#. Массивы объектов. Интерфейс IComparer

Пример 7. Сортировка массива объектов

Слайд 23

C#. Массивы объектов. Интерфейс IComparer Пример 7. Сортировка массива объектов

C#. Массивы объектов. Интерфейс IComparer

Пример 7. Сортировка массива объектов

Слайд 24

C#. Массивы объектов. Интерфейс IComparer Пример 7. Сортировка массива объектов

C#. Массивы объектов. Интерфейс IComparer

Пример 7. Сортировка массива объектов

Слайд 25

C#. Структуры Описание структуры: [ Модификатор доступа ] struct ИмяСтруктуры [

C#. Структуры

Описание структуры:
[ Модификатор доступа ] struct ИмяСтруктуры [

: интерфейсы]
{ // члены структуры – поля и методы
Модификатор доступа Тип имяПоля ;
Модификатор доступа Тип имяМетода (Параметры) {
// тело метода }
}
Модификаторы доступа для членов структуры:
public , internal, private ;
Доступом по умолчанию для членов структуры является private
Создание экземпляра структуры:
ИмяСтруктуры имяОбъекта;
ИмяСтруктуры имяОбъекта = new ИмяСтруктуры([ параметры конструктора]);
Доступ к полям и методам объекта:
имяОбъекта.имяПоля = значение;
ИмяОбъекта.имяМетода(параметры);
Слайд 26

C#. Структуры Структура – это тип данных, аналогичный классу, но имеющий

C#. Структуры

Структура – это тип данных, аналогичный классу, но имеющий

ряд важных отличий от него:
Структура является значимым, а не ссылочным типом данных, то есть экземпляр структуры располагается в стеке, а не в куче;
Структура не может участвовать в иерархиях наследования, она может только реализовывать интерфейсы;
В структуре запрещено определять конструктор по умолчанию, он определен неявно и присваивает всем ее элементам значения по умолчанию (нули соответствующего типа);
При описании структуры нельзя задавать значения полей по умолчанию (кроме статических полей);
Переопределяться (override) могут только методы, унаследованные от базового класса object;
В структуре запрещено определять деструкторы.
Замечание. Строго говоря любой значимый тип С# является структурным.
Отличия от классов обуславливают область применения структур: типы данных, имеющие небольшое количество полей, с которыми удобнее работать как со значениями, а не как со ссылками. Накладные расходы на динамическое выделение памяти для небольших объектов могут значительно снизить быстродействие программы, поэтому их эффективнее описывать как структуры, а не как классы.
Замечание. С другой стороны, передача экземпляра структуры в метод по значению требует и дополнительного времени, и дополнительной памяти.
При выводе экземпляра структуры на консоль выполняется упаковка, то есть неявное преобразование в ссылочный тип. Упаковка применяется и в других случаях, когда структурный тип используется там, где ожидается ссылочный. При обратном преобразовании – из ссылочного типа в структурный – выполняется распаковка.
При присваивании экземпляров структур создается копия значений полей. То же самое происходит и при передачи структур в качестве параметра по значению. Для экономии ресурсов ничто не мешает передавать структуры в методы по ссылке с помощью ключевых слов ref или out.
Особенно значительный выигрыш в эффективности можно получить, используя массивы объектов структур вместо массивов объектов классов. Например, для массива из 100 объектов класса создается 101 объект, а для массива объектов структур – один объект.
Слайд 27

C#. Структуры Пример 8.

C#. Структуры

Пример 8.

Слайд 28

C#. Структуры Пример 8.

C#. Структуры

Пример 8.