Foreversoft.ru

IT Справочник
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Конструктор си шарп

Классы. Объектно-ориентированное программирование

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

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

Описанием объекта является класс , а объект представляет экземпляр этого класса. Можно еще провести следующую аналогию. У нас у всех есть некоторое представление о человеке, у которого есть имя, возраст, какие-то другие характеристики. То есть некоторый шаблон — этот шаблон можно назвать классом. Конкретное воплощение этого шаблона может отличаться, например, одни люди имеют одно имя, другие — другое имя. И реально существующий человек (фактически экземпляр данного класса) будет представлять объект этого класса.

По умолчанию проект консольного приложения уже содержит один класс Program, с которого и начинается выполнение программы.

По сути класс представляет новый тип, который определяется пользователем. Класс определяется с помощью ключевого слова сlass :

Где определяется класс? Класс можно определять внутри пространства имен, вне пространства имен, внутри другого класса. Как правило, классы помещаются в отдельные файлы. Но в данном случае поместим новый класс в файле, где располагается класс Program. То есть файл Program.cs будет выглядеть следующим образом:

Вся функциональность класса представлена его членами — полями (полями называются переменные класса), свойствами, методами, событиями. Например, определим в классе Person поля и метод:

В данном случае класс Person представляет человека. Поле name хранит имя, а поле age — возраст человека. А метод GetInfo выводит все данные на консоль. Чтобы все данные были доступны вне класса Person переменные и метод определены с модификатором public. Поскольку поля фактически те же переменные, им можно присвоить начальные значения, как в случае выше, поле age инициализировано значением 18.

Так как класс представляет собой новый тип, то в программе мы можем определять переменные, которые представляют данный тип. Так, здесь в методе Main определена переменная tom, которая представляет класс Person. Но пока эта переменная не указывает ни на какой объект и по умолчанию она имеет значение null . Поэтому вначале необходимо создать объект класса Person.

Конструкторы

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

Конструктор по умолчанию

Если в классе не определено ни одного конструктора, то для этого класса автоматически создается конструктор по умолчанию. Такой конструктор не имеет параметров и не имеет тела.

Выше класс Person не имеет никаких конструкторов. Поэтому для него автоматически создается конструктор по умолчанию. И мы можем использовать этот конструктор. В частности, создадим один объект класса Person:

Для создания объекта Person используется выражение new Person() . Оператор new выделяет память для объекта Person. И затем вызывается конструктор по умолчанию, который не принимает никаких параметров. В итоге после выполнения данного выражения в памяти будет выделен участок, где будут храниться все данные объекта Person. А переменная tom получит ссылку на созданный объект.

Если конструктор не инициализирует значения переменных объекта, то они получают значения по умолчанию. Для переменных числовых типов это число 0, а для типа string и классов — это значение null (то есть фактически отсутствие значения).

После создания объекта мы можем обратиться к переменным объекта Person через переменную tom и установить или получить их значения, например, tom.name = «Tom»; .

Консольный вывод данной программы:

Создание конструкторов

Выше для инициализации объекта использовался конструктор по умолчанию. Однако мы сами можем определить свои конструкторы:

Теперь в классе определено три конструктора, каждый из которых принимает различное количество параметров и устанавливает значения полей класса. Используем эти конструкторы:

Консольный вывод данной программы:

При этом если в классе определены конструкторы, то при создании объекта необходимо использовать один из этих конструкторов.

Ключевое слово this

Ключевое слово this представляет ссылку на текущий экземпляр класса. В каких ситуациях оно нам может пригодиться? В примере выше определены три конструктора. Все три конструктора выполняют однотипные действия — устанавливают значения полей name и age. Но этих повторяющихся действий могло быть больше. И мы можем не дублировать функциональность конструкторов, а просто обращаться из одного конструктора к другому через ключевое слово this, передавая нужные значения для параметров:

Читать еще:  Что такое си кам модуль

В данном случае первый конструктор вызывает второй, а второй конструктор вызывает третий. По количеству и типу параметров компилятор узнает, какой именно конструктор вызывается. Например, во втором конструкторе:

идет обращение к третьему конструктору, которому передаются два значения. Причем в начале будет выполняться именно третий конструктор, и только потом код второго конструктора.

Также стоит отметить, что в третьем конструкторе параметры называются также, как и поля класса.

И чтобы разграничить параметры и поля класса, к полям класса обращение идет через ключевое слово this. Так, в выражении this.name = name; первая часть this.name означает, что name — это поле текущего класса, а не название параметра name. Если бы у нас параметры и поля назывались по-разному, то использовать слово this было бы необязательно. Также через ключевое слово this можно обращаться к любому полю или методу.

Инициализаторы объектов

Для инициализации объектов классов можно применять инициализаторы . Инициализаторы представляют передачу в фигурных скобках значений доступным полям и свойствам объекта:

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

При использовании инициализаторов следует учитывать следующие моменты:

С помощью инициализатора мы можем установить значения только доступных из внешнего кода полей и свойств объекта. Например, в примере выше поля name и age имеют модификатор доступа public, поэтому они доступны из любой части программы.

Инициализатор выполняется после конструктора, поэтому если и в конструкторе, и в инициализаторе устанавливаются значения одних и тех же полей и свойств, то значения, устанавливаемые в конструкторе, заменяются значениями из инициализатора.

Конструкторы

Понятие «Конструктор» (constructor) неотделимо от понятия класса. Конструкторы — это специальные функции, вызываемые автоматически при инициализации объектов. Их имена совпадают с именами классов, которым они принадлежат, и они не имеют типа возврата. У одного класса может быть более одного конструктора, различающихся сигнатурами. Конструкторы полезны для инициализации полей класса. Интересно, что компилятор создает конструктор по умолчанию без параметров, он устанавливает поля в 0, false или null (для объектов).

Рассмотрим пример. Создадим класс «Треугольник» с тремя полями и одним методом, вычисляющим его периметр.

Результат выполнения программы: периметр = 0

АНАЛИЗ

В окне ошибок первый раз появляются 3 предупреждения (но не ошибки!):
Полю «Конструктор.Triangle.c» нигде не присваивается значение, поэтому оно всегда будет иметь значение по умолчанию 0 (тоже для полей a и b).

Так как сработал конструктор без параметров Triangle(), то всем сторонам треугольника был присвоен 0. Добавим в определение класса строку: Triangle(); и запустим программу. Получим сообщение об ошибке:
Тип «Конструктор.Triangle» уже определяет член «Triangle» с такими же типами параметров.
Это подтверждает тот факт, что конструктор с нулем параметров уже был создан. Теперь добавим в описание класса конструктор с тремя параметрами:

А в метод Main() первую строку заменим на:

Результат выполнения программы: периметр = 12

То есть, мы выполнили инициализацию полей (a, b, c) объекта tr, на что указывает ключевое слово this в операторах конструктора. Иначе нам бы пришлось указывать разные имена: a = d; где d был бы тогда первым элементом в списке параметров. Оператор типа a = a оставит значение поля a=0, а компилятор выдаст предупреждение:
Проведено присвоение той же переменной; действительно выполнить такое назначение, а не иное?

Практический совет: Не устранив синтаксические ошибки, вы не получите работающую программу. Но иногда предупреждения сигнализируют и о возможных крупных несуразностях вашего кода.

Напомним, что так как по умолчанию поля класса являются закрытыми (private), то их нельзя изменить непосредственно в программе, например:
tr.c = 7;
В этом случае получим сообщение об ошибке:
«Конструктор.Triangle.c» недоступен из-за его уровня защиты.

Ошибка устранится, если к описанию поля с добавим модификатор public:
public int c;
Однако это не является хорошим тоном в ООП, поле перестает быть защищенным.

Читать еще:  Самый безопасный антивирус

В отличие от структур классы относятся к ссылочным (reference) типам данных, их экземпляры (объекты) “живут” в куче (heap). Поэтому при создании объекта резервируется для полей место в куче, и в зависимости от конструктора полям задаются значения 0, false или null (для конструктора по умолчанию), либо соответствующие значения (для конструктора с параметрами).

Проверьте на практике правильность следующих утверждений:

1) Можно ли создать конструктор по умолчанию? — Да.
2) Если создается свой конструктор, будет ли компилятор генерировать конструктор по умолчанию? — Нет.
3) Если в своём конструкторе не будут инициализированы некоторые поля, будут ли они автоматически инициализированы компилятором? — Да.
4) Разрешается ли инициализировать переменные там, где их объявляют? — Да.

Пример конструктора при наследовании класса

Воспользуемся готовым классом Random из библиотеки System. Создадим дочерний класс RwName («Random with Name»), добавим в него поле s и два метода, а также модифицируем конструктор класса:

Теперь объект класса получит наименование через конструктор, а два метода класса стали более специфичными. Даже если вы не указали в объявлении класса имя «родителя», он все равно будет наследовать конструктор класса Object.

Статический конструктор

Конструктор можно также объявить как static. Статический конструктор, как правило, используется для инициализации компонентов, применяемых ко всему классу, а не к отдельному экземпляру объекта этого класса. Поэтому члены класса инициализируются статическим конструктором до создания каких-либо объектов этого класса:

Важно, что конструктор типа static вызывается автоматически, причем до конструктора экземпляра. Из этого следует, что статический конструктор должен выполняться до любого конструктора экземпляра. У статических конструкторов отсутствуют модификаторы доступа — они пользуются доступом по умолчанию, а следовательно, их нельзя вызывать из программы.

ВЫВОД

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

BestProg

Инициализация данных в классе. Конструктор класса. Конструктор по умолчанию

Содержание

1. Что такое конструкторы? Какие отличия между методами класса и конструкторами?

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

Как правило, конструктор применяется для:

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

2. Какая общая форма конструктора?

Ниже приведена общая форма конструктора:

  • доступ – модификатор доступа. Чаще всего это модификатор доступа public . Если конструктор вызывается из-за границ класса, то он обязательно должен иметь доступ public .
  • параметры – список параметров, которые получает конструктор. Список параметров может быть пустым.

Пример объявления конструктора для класса MyPoint . В данном конструкторе получается два параметра с именами newx , newy . Эти параметры инициализируют внутренние переменные класса x и y .

3. Сколько конструкторов может иметь класс?

Класс может иметь любое число конструкторов, которые должны отличаться один от другого числом параметров и/или типами параметров.

4. Что такое конструктор по умолчанию?

Если не определить конструктор в классе, язык C# автоматически создаст конструктор по умолчанию. Этот конструктор инициализирует все переменные экземпляра класса их значениями по умолчанию.

Для большинства типов данных значение по умолчанию есть нулевым, для типа bool – false , для ссылочных типов – пустое значение.

Пример. Пусть задан класс MyBook , содержащий только данные. В классе нет ни одного описанного конструктора. Все равно, при создании экземпляра класса (оператор new ), будет вызван конструктор по умолчанию.

5. Пример инициализации класса с помощью конструкторов.

Пусть дано описание класса типа MyBook . В классе MyBook описываются два конструктора. Один конструктор без параметров. Другой конструктор получает четыре параметра, которые заполняют соответствующие внутренние поля класса MyBook .

Читать еще:  Потоки си шарп

6. Какие конструкторы называются параметризированными?

Параметризированные конструкторы – это конструкторы, которые принимают один и больше параметров.

7. Перегрузка конструкторов. Каким образом осуществляется перегрузка конструкторов? Пример

Конструктор, как и любой метод, может быть «перегруженным». То есть, в классе может быть несколько конструкторов, которые отличаются между собой типами и (или) количеством параметров.

Пример. Объявляется класс Time , который реализует время: часы, минуты, секунды. В классе реализуется 4 конструктора с разным количеством параметров. Исходный код класса следующий:

Использование класса Time в другом методе (программном коде):

8. Можно ли из одного конструктора вызвать другой конструктор?

Да можно. Это осуществляется с помощью ключевого слова this . Ключевое слово this есть ссылкой на текущий класс. То есть, this есть именем текущего класса, а значит, может использоваться как конструктор.

9. Каким образом можно вызывать один конструктор из другого? Общая форма

Общая форма вызова из одного конструктора другого в классе, который носит имя ClassName :

В этом случае сначала выполняется конструктор

а затем выполняется конструктор

Тело конструктора ClassName может быть пустой.

10. Пример вызова одного конструктора из другого

В примере реализуется класс Time , который описывает время. В классе есть несколько конструкторов. Каждый из них инициализируется по разному.

Листинг класса следующий

Использование класса в другом программном коде (методе)

Конструкторы в C#

Всем доброго времени суток. На связи Алексей Гулынин. В данной статье я бы хотел рассказать, что такое конструкторы в C#. В прошлой статье, посвященной классам в C# мы присваивали значения переменным объекта следующим образом:

Данный способ является приемлемым, но не является оптимальным. Переменные необходимо определять в конструкторе класса .

Конструктор инициализирует объект при его создании, т.е. объект будет иметь заполненную структуру уже при создании. Конструктор имеет такое же имя, что и сам класс. По синтаксису похож на метод. В определении конструктора не указывается тип возвращаемого значения:

В качестве уровня доступа обычно используется public , так как конструктор обычно вызывается вне класса. Все классы имеют конструкторы, независимо от того, создаёте вы его или нет ( C# автоматически создаёт конструктор по умолчанию). Данный конструктор инициализирует все переменные-члены, имеющие тип значений, нулями, а переменные ссылочного типа — null значениями. Давайте создадим свой собственный конструктор, на основе предыдущего примера:

Если мы теперь создадим объект класса Room, то его поле length (поле объекта) будет уже иметь значение, равное 7:

В нашем примере использовался конструктор без параметров. А что если мы захотим изменить длину нашей комнаты. Для этого придётся написать newRoom.length = 6. Чтобы этого не делать, используются параметризированные конструкторы . Параметры вносятся в конструктор точно также, как и в метод. Давайте создадим параметризированный конструктор для нашего класса Room :

Давайте теперь создадим новый объект, передав в конструктор параметры:

При использовании оператора new объектам динамически выделяется память из пула свободной памяти. Данный объем свободной памяти не бесконечен. Есть риск возникновения ситуации, когда память под объект не будет выделена. Поэтому в схеме динамического выделения памяти есть механизм очистки от неиспользуемых объектов. Данный процесс может выполняться вручную (например в Javascript с помощью оператора delete ). В C# за это отвечает механизм сборки мусора, который не требует участия программиста.

В языке C# можно определить метод, который будет вызываться непосредственно перед тем, когда объект будет уничтожен (т.е. когда его настигнет сборщик мусора). Этот метод называется деструктор . Синтаксис его следующий:

Деструктор вызывается только перед началом работы системы сбора мусора. Мы не можем знать точно, когда будет вызван деструктор, но точно знаем, что он будет вызван перед завершением работы программы. Для нашего примера деструктор будет иметь вид:

В качестве домашнего задания: переделайте пример из предыдущей статьи только с использованием параметризированного конструктора.

В данной статье вы узнали, что такое конструкторы в C#.

На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.

Ссылка на основную публикацию
Adblock
detector