
- •Программирование на языке Visual c#
- •14. Объектно-ориентированное программирование
- •14.1. Основные принципы ооп
- •14.2. Объекты
- •14.3. Классы
- •14.4. Определение классов и их членов
- •14.4.1. Определение полей
- •14.4.2. Определение свойств
- •14.4.3. Определение методов
- •14.4.4. Конструкторы
- •14.5. Статические классы и их члены
- •9.5. Члены классов
14.4.4. Конструкторы
Конструкторы вызываются при первоначальной загрузке класса средой CLR или при создании объекта [5]. Существуют два типа конструкторов: статические конструкторы и конструкторы экземпляра. Класс может иметь только один статический конструктор, не имеющий параметров. Он вызывается, когда CLR загружает тип. Имя статического конструктора должно совпадать с именем класса, к которому он принадлежит. Как и к любому другому члену класса, к статическому конструктору можно присоединять атрибуты метаданных.
С другой стороны, конструкторы экземпляра вызываются при создании экземпляра класса. Обычно они устанавливают состояние объекта за счет инициализации полей в желательное предопределенное состояние. Можно также предпринять любые другие действия по инициализации, такие как подключение к базе данных и открытие файла. У класса может быть несколько конструкторов экземпляра, которые могут быть перегружены (т.е. иметь разные типы параметров). Подобно статическим конструкторам, конструкторы экземпляра именуются по названию определяющего их класса. Особенность таких конструкторов состоит в необязательности выражения инициализатора. С помощью инициализатора, который следует за двоеточием после списка параметров, можно вызвать конструктор базового класса или другой конструктор того же класса, указывая, соответственно, ключевые слова base и this. О ключевом слове base пойдет речь в разделе "Ключевое слово base" далее в главе. Рассмотрим следующий пример кода с двумя комментариями:
class Base
{ public int x = InitX();
public Base(int x)
{ this.x = x; // устранение неоднозначности между
// параметром и переменной экземпляра
}
}
class Derived : Base
{ public Derived(int a) : base(a) // вызов конструктора
// базового класса
{
}
}
(MSDN_ООП_VB+C#_2010)
Конструкторы – это методы классов, выполняемые автоматически при создании объекта заданного класса. Обычно конструкторы выполняют инициализацию членов данных нового объекта. Конструктор можно запустить только один раз при создании класса. Кроме того, код конструктора всегда выполняется раньше всех остальных частей кода в классе. Следует отметить, что так же, как и для других методов, можно создать несколько перегрузок конструктора.
Определение конструктора для класса:
public class SampleClass
{ public SampleClass()
{ // Код конструктора
}
}
Деструкторы используются для уничтожения экземпляров классов. В платформе .NET Framework сборщик мусора автоматически управляет распределением и освобождением памяти для управляемых объектов приложения. Однако для очистки неуправляемых ресурсов, создаваемых приложением, могут потребоваться деструкторы. На один класс допускается только один деструктор.
Инициализация объектов с помощью инициализатора объектов.
(http://msdn.microsoft.com/ru-ru/library/bb397680.aspx)
Можно использовать инициализаторы объектов для декларативной инициализации объектов типов без явного вызова конструктора типа.
В следующем примере показано, как использовать инициализаторы объектов с именованными объектами. Компилятор рассматривает инициализаторы объекта сначала получить доступ к конструктору экземпляра по умолчанию, а затем обработать инициализации членов. Таким образом, при объявлении конструктора по умолчанию в классе как private, обработка инициализаторов объектов, требующих открытый доступ, приведет к ошибке.
В следующем примере показано, как инициализировать новый тип StudentName с помощью инициализаторов объектов.
public class Program
{ public static void Main()
{ // Объявление StudentName с помощью конструктора с двумя параметрами
StudentName student1 = new StudentName("Craig", "Playstead");
// Объявление StudentName с помощью конструктора при
// использовании инициализатора объекта и задания 2-х параметров.
// Заданный по умолчанию конструктор вызван при объявлении,
// а не используя конструктор с 2-мя параметрами.
StudentName student2 = new StudentName
{ FirstName = "Craig",
LastName = "Playstead",
};
// Declare a StudentName by using an object initializer and
// sending an argument for only the ID property. No
// corresponding constructor is necessary. Only the default
// constructor is used to process object initializers.
StudentName student3 = new StudentName
{ ID = 183
};
// Declare a StudentName by using an object initializer and
// sending arguments for all three properties. No corresponding
// constructor is defined in the class.
StudentName student4 = new StudentName
{ FirstName = "Craig",
LastName = "Playstead",
ID = 116
};
System.Console.WriteLine(student1.ToString());
System.Console.WriteLine(student2.ToString());
System.Console.WriteLine(student3.ToString());
System.Console.WriteLine(student4.ToString());
}
}
// Вывод:
// Craig 0
// Craig 0
// 183
// Craig 116
public class StudentName
{ // The default constructor has no parameters. The default
// constructor is invoked in the processing of object
// initializers. You can test this by changing the access
// modifier from public to private. The declarations in Main that
// use object initializers will fail.
public StudentName() { }
// The following constructor has parameters for two of the three
// properties.
public StudentName(string first, string last)
{ FirstName = first;
LastName = last;
}
// Properties.
public string FirstName { get; set; }
public string LastName { get; set; }
public int ID { get; set; }
public override string ToString()
{ return FirstName + " " + ID;
}
}