Поиск

Конструкторы

Одним из величайших преимуществ языков ООП, таких как С#, в том, что вы можете определять специальные методы, вызываемые всякий раз при создании экземпляра класса. Эти методы называются конструкторами (constructors). C# вводит в употребление новый тип конструкторов — статические (static constructors). С ними вы познакомитесь в разделе "Статические члены и члены экземпляров".

Гарантия инициализации объекта должным образом, прежде чем он будет использован, — ключевая выгода от конструктора. Когда пользователь создает экземпляр объекта, вызывается его конструктор, который должен вернуть управление, прежде чем пользователь сможет выполнить над объектом другое действие. Именно это помогает обеспечивать целостность объекта и сделать написание приложений на объектно-ориентированных языках гораздо надежнее.

Но как назвать конструктор, чтобы компилятор знал, что его надо вызывать при создании экземпляра объекта? Разработчики С# последовали в этом вопросе Страуструпу и провозгласили, что у конструкторов в С# должно быть то же имя, что и у самого класса. Вот простой класс с таким же простым конструктором:

using System;
class ConstructorlApp {
Constructor1App()
{
Console.WriteLine("Я конструктор.");
}
public static void Main() {
ConstructorlApp app = new Constructor1App(); } >

Значений конструкторы не возвращают. При попытке использовать с конструктором в качестве префикса имя типа, компилятор сообщит об ошибке, пояснив, что вы не можете определять члены с теми же именами, что у включающего их типа.

Следует обратить внимание и на способ создания экземпляров объектов в С#. Это делается при помощи ключевого слова new:

<класс> <объект> = new <класс> (аргументы конструктора)

Если раньше вы программировали на C++, обратите на это особое внимание. В C++ вы могли создавать экземпляр объекта двумя способами: объявлять его в стеке, скажем, так: /

// Код на C++. Создает экземпляр CmyClassj в стеке
. CMyClass myClass;
или создать копию объекта в свободной памяти (или в куче),
используя ключевое слово C++ new: \
/I Код на C++. Создает экземпляр CmyClass в куче.
CMyClass myClass = new CMyClassQ;

Экземпляры объектов на С# создаются иначе, что и сбивает с толку новичков в разработке на С#. Причина путаницы в том, что для создания объектов оба языка используют одни и те же ключевые слова. Хотя с помощью ключевого слова new в C++ можно указать, где именно будет создаваться объект, место создания объекта на С# зависит от типа объекта, экземпляр которого создается. Как вы уже знаете, ссылочные типы создаются в куче, а размерные — в стеке (см. главу 4). Поэтому ключевое слово new позволяет создавать новые экземпляры класса, но не определяет место создания объекта.

Хотя можно сказать, что приведенный ниже код на С# не содержит ошибок, он делает совсем не то, что может подумать разработчик на C++:

MyClass myClass;

На C++ он создаст в стеке экземпляр MyClass. Как сказано выше, на С# вы можете создавать объекты, только используя ключевое слово new. Поэтому на С# эта строка лишь объявляет переменную myClass как переменную типа MyClass, но не создает экземпляр объекта.

Примером служит следующая программа, при компиляции которой компилятор С# предупредит, что объявленная в приложении переменная ни разу не используется:

using System;
class Constructor2App {
Constructor2App()
{
Console.WriteLine("Я конструктор");
}
public static void MainQ {
Constructor2App app; > }

Поэтому, объявляя объект, создайте где-нибудь в программе его экземпляр, используя ключевое слово new:

Constructог2Арр арр;
app =new Constructor2App();

Зачем объявлять объект, не создавая его экземпляров? Объекты объявляются перед использованием или созданием их экземпляров с помощью / new, если вы объявляете один класс внутри другого. Такая вложенность классов называется включение (containment) или агрегирование (aggregation).