Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Конструкторы и инициализация объектов



Конструктор выполняет начальную инициализацию объекта или класса. Синтаксис описания конструктора напоминает синтаксис описания метода. Однако имя конструктора всегда совпадает с именем класса, а любое указание на тип возвращаемого значения отсутствует (даже 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 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.006 с)...