Урок № 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>();

Так тоже можно делать, вероятно иногда, так поступать даже лучше, но не всегда возможно… Ну, на этот раз хватит информации!

Перейти к следующему уроку