Вызов конструкторов из других конструкторов.

Лабораторная работа № 3 Конструкторы, поля только для чтения, вызов конструкторов.

Конструктор – это метод класса, имеющий имя класса.

Конструкторов в классе может быть несколько или ни одного.

На конструкторы накладываются следующие ограничения:

1. Конструктор не может иметь возвращаемого значения даже void.

2. Как следствие первого ограничения нельзя использовать оператор return().

3. Конструкторы нельзя объявлять виртуальными.

Конструктор автоматически вызывается на этапе компиляции при создании экземпляра данного класса. Попытка вызвать конструктор явным образом вызовет ошибку компиляции.

Различают следующие типы конструкторов:

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

2. Конструктор с аргументами.

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

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

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

Пример. В классе нет явно объявленных конструкторов

public class Person

{

private string _name;

private string _surname;

private DateTime _birthDate;

public string Name

{

get { return _name; }

set { _name = value; }

}

public string Surname

{

get { return _surname; }

set { _surname = value; }

}

public DateTime BirthDate

{

get { return _birthDate; }

set { _birthDate = value; }

}

}

private static void Main(string[] args)

{

Console.WriteLine("Лабораторная работа 3");

Person person = new Person();

Console.WriteLine(person.Name);

Console.Read();

}

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

public class Person

{

private string _name;

private string _surname;

private DateTime _birthDate;

public string Name

{

get { return _name; }

set { _name = value; }

}

public string Surname

{

get { return _surname; }

set { _surname = value; }

}

public DateTime BirthDate

{

get { return _birthDate; }

set { _birthDate = value; }

}

public Person()

{

_name = "Иван";

_surname = "Иванов";

_birthDate = new DateTime(1990,01,01);

}

}

Конструктор с аргументами.

Большинство конструкторов в С# принимают аргументы, с помощью которых разные объекты данного класса могут быть по разному инициализированы.

Пример.

public class Person

{

private string _name;

private string _surname;

private DateTime _birthDate;

public Person()

{

_name = "Иван";

_surname = "Иванов";

_birthDate = new DateTime(1990,01,01);

}

public Person(string name, string surname)

{

_name = name;

_surname = surname;

}

public Person(string name, string surname, DateTime birthDate)

{

_name = name;

_surname = surname;

_birthDate = birthDate;

}

public string Name

{

get { return _name; }

set { _name = value; }

}

public string Surname

{

get { return _surname; }

set { _surname = value; }

}

public DateTime BirthDate

{

get { return _birthDate; }

set { _birthDate = value; }

}

}

private static void Main(string[] args)

{

Console.WriteLine("Лабораторная работа 3");

Person firstPerson = new Person("Иванов","Олег", new DateTime(1985, 12, 10));

Person secondPerson = new Person("Иванов","Олег");

Person thirdPerson = new Person();

Console.WriteLine(person.Name);

}

Поля только для чтения

Поле только для чтения – это константное поле, значение которого изменить нельзя. Начальное значение поля только для чтения может быть вычислено в процессе выполнения приложения и установлено с помощью конструктора. Для объявления поля для чтения используется ключевое слово readonly.

Вызов конструкторов из других конструкторов.

Очень часто разные конструкторы независимо друг от друга содержат частично совпадающий код. С целью уменьшения объема программы рекомендуется, для выполнения совпадающего кода, осуществлять вызов конструкторов из других конструкторов. Для этого после имени конструктора указывается, через двоеточие, ключевое слово this со списком передаваемых параметров:

public Person(string name, string surname, DateTime birthDate):this(name, surname)

{

_birthDate = birthDate;

}

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

Вопросы:

1. Как отличить конструктор класса от других функций класса?

2. Для чего используются конструкторы?

3.В каком случае компилятор сам создает конструктор по умолчанию?

Наши рекомендации