Урок № 20. Конструкторы и инициализация объектов
Инициализация объектов в C#
Доброго времени суток! В этом уроке я дам самую необходимую информации о создании объектов и их инициализации. Вы узнаете, что такое конструкторы классов в C#, а также, другие способы инициализации полей классов. И так, к делу!
Большинство классов содержат поля, который хранят какую-то важную информацию об объекте. Например, имя студента и его курс, как в примере из предыдущего урока. Но перед тем как программист начнет использовать созданный объект, эти поля должны получить какие-то начальные значения, чтобы использование объекта не привело к ошибке в программе. А это может случится очень легко, если разработчик класса упустит какую-нибудь деталь! Скажу сразу, что задавать начальные значения полям класса можно несколькими способами, один способ мы уже использовали (когда создавали поле-список в примере из предыдущего урока), а другой способ – это использование конструкторов.
Так что же такое конструктор класса? Можно сказать, что конструктор — это очень специфический метод, который имеет тоже имя что и класс, вызывается системой во время создания каждого объекта класса, и не возвращает никакие значения. Именно по той причине, что конструктор вызовется автоматически в нужное время, его удобно использовать в качестве некого инициализатора.
Ведь действительно, мы бы могли и сами создать обычный метод, предназначенный для инициализации объектов, и вызывать его самостоятельно, но это лишние действия, поэтому для этих целей используют конструкторы.
Так же, довольно удобно, что в классе может быть несколько конструкторов, например, два, они оба должны иметь тоже имя что и класс, но должны отличаться списком параметров (аргументов). Так, один конструктор может не иметь аргументов, а второй – иметь. Давайте для примера добавим в класс «Student» из предыдущего урока пару конструкторов.
//Класс, описывающий простого студента class Student { /*Группа конструкторов*/ /* * Конструктор без аргументов, создает * студента первого курса и без имени */ public Student() { name = ""; grade = 1; } /* * Конструктор с аргументами, задает * указанные имя и курс студента */ public Student(string aName, uint aGrade) { name = aName; grade = aGrade; } /*….*/ //Поля класса private string name; //Имя студента private uint grade; //Курс /* * Поле-список для хранения результатов экзаменов (оценок) * Использованы одновременное объявления и инициализация поля */ private List<uint> results = new List<uint>(); }
Обратите внимание, при объявлении конструкторов в классе, мы не указывали тип возвращаемого значения, даже не писали ключевое слово void, как сделали бы для метода, который нечего не возвращает.
Как видно, в классе созданы два конструктора, первый без аргументов, в нем, полям «name» и «grade» присваиваются некие значения по умолчанию (пустое имя и первый курс). Создавать «студентов» используя такой конструктор можно следующим образом:
//Создаем безликого «студента» //(вызывается конструктор без аргументов) Student tmpStudent = new Student();
Второй конструктор, принимает имя и курс в качестве параметров и устанавливает их полям «name» и «grade» соответственно. Создавать студентов с помощью такого конструктора можно так:
//Создаем объект-студента Student ivanStudent = new Student("Иван", 2);
Таким образом, будет создан «студент» второго курса с именем «Иван». А раньше, для этого мы писали больше кода:
//Создаем объект-студента (пока "безликого") Student ivanStudent = new Student(); //Задаем значения полей объекта ivanStudent.Name = "Иван"; //Задаем имя, работает метод set свойства Name ivanStudent.Grade = 2; //Задаем курс, работает метод set свойства Grade
А теперь, давайте рассмотрим инициализацию третьего поля (поля «results»), она на самом деле тоже выполняется, но не в конструкторах, а сразу при объявлении:
private List<uint> results = new List<uint>();
Так тоже можно делать, вероятно иногда, так поступать даже лучше, но не всегда возможно… Ну, на этот раз хватит информации!