Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Конструктор выполняет начальную инициализацию объекта или класса. Синтаксис описания конструктора напоминает синтаксис описания метода. Однако имя конструктора всегда совпадает с именем класса, а любое указание на тип возвращаемого значения отсутствует (даже void).
Задача экземплярных конструкторов – создание и инициализация объекта. Любой экземплярный конструктор в начале свой работы выполняет размещение объекта в динамической памяти и инициализацию полей объекта. Различают два вида экземплярных конструкторов – конструкторы по умолчанию и пользовательские конструкторы.
Конструктор по умолчанию автоматически создаётся компилятором, если программист не описал в классе собственный конструктор. Конструктор по умолчанию – это всегда конструктор без параметров.
// класс Pet не содержит описания конструктора
public class Pet
{
public int Age;
public string Name = "I'm a pet";
}
var dog = new Pet(); // вызов конструктора по умолчанию
Console.WriteLine(dog.Age); // выводит "0"
Console.WriteLine(dog.Name); // выводит "I'm a pet"
Пользовательский конструктор описывается программистом. Класс может содержать несколько пользовательских конструкторов, однако они обязаны различаться сигнатурой. Если в классе определён хотя бы один пользовательский конструктор, конструктор по умолчанию уже не создаётся.
// класс Pet содержит два пользовательских конструктора
public class Pet
{
public int Age;
public string Name;
public Pet()
{
Name = "I'm a pet";
}
public Pet(int age, string name)
{
Age = age;
Name = name;
}
}
В приведённом примере можно было ограничиться одним пользовательским конструктором, если использовать значения параметров по умолчанию:
public class Pet
{
public int Age;
public string Name;
public Pet(int age = 0, string name = "I'm a pet")
{
Age = age;
Name = name;
}
}
Пользовательские конструкторы могут применяться для начальной инициализации readonly-полей (т.е. readonly-поля доступны для записи, но только в конструкторе). Пользовательский конструктор может вызвать другой конструктор того же класса, но только в начале своей работы. Для этого при описании конструктора используется синтаксис, аналогичный приведённому в следующем примере:
public Pet(): this(10, "Pet") {... }
Для вызова экземплярных конструкторов используется операция new, которая возвращает созданный объект. У объекта нельзя вызвать конструктор как метод (т.е. в виде имя-объекта.имя-конструктора).
// вызов конструкторов для создания объекта
var cat = new Pet();
var dog = new Pet(5, "Buddy");
Статические конструкторы используются для начальной инициализации статических полей класса. Статический конструктор всегда объявляется с модификатором static и без параметров. Область видимости у статических конструкторов не указывается. В теле статического конструктора возможна работа только со статическими полями и методами класса. Статический конструктор не может вызывать экземплярные конструкторы в начале своей работы.
public class Account
{
private static double _tax;
static Account()
{
_tax = 0.1;
}
}
Статические конструкторы вызываются не программистом, а общеязыковой средой исполнения в следующих случаях[10]:
– перед созданием первого объекта класса или при первом обращении к элементу класса, не унаследованному от предка;
– перед первым обращением к статическому полю, не унаследованному от предка.
При работе с объектами достаточно типичной является ситуация, когда объект вначале создаётся, а затем настраивается путём установки свойств:
var s = new Student();
s.Name = "Mr. Spiderman";
s.Age = 18;
C# позволяет совместить создание объекта с его настройкой. Для этого после параметров конструктора в фигурных скобках требуемым public-элементам класса (обычно это свойства) присваиваются их значения (если конструктор не имел параметров, можно не указывать круглые скобки после его имени):
var s = new Student {Name = "Mr. Spiderman", Age = 18};
Инициализация объектов действует и для классов-коллекций. Предполагается, что такой класс реализует интерфейс IEnumerable и имеет public-метод Add(). Именно этот метод вызывает компилятор, когда обрабатывает код инициализации:
var x = new List<int> {1, 4, 8, 8};
var y = new List<string> {"There", "is", "no", "spoon"};
Инициализация коллекций работает, даже если у метода Add() несколько параметров. В таком случае эти параметры записываются в фигурных скобках:
var cars = new Dictionary<int, string> {{1, "Ford"}, {2, "Opel"}};
Дата публикования: 2015-11-01; Прочитано: 479 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!