Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоргалка исис.docx
Скачиваний:
67
Добавлен:
10.02.2015
Размер:
155 Кб
Скачать
☆

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

Конструктор предназначен для инициализации объекта. Конструкторы делятся на конструкторы класса (для статических классов) и конструкторы экземпляра класса (всех остальных классов).

Конструкторы экземпляра

Конструктор экземпляра вызывается авто­матически при создании объекта класса с помощью операции new. Имя конст­руктора совпадает с именем класса. Рассмотрим основные свойства конструкторов:

  1. Конструктор не возвращает значение, даже типа void.

  2. Класс может иметь несколько конструкторов с разными параметрами для раз­ных видов инициализации.

  3. Если программист не указал ни одного конструктора или какие-то поля не были инициализированы, полям значимых типов присваивается нуль, полям ссылочных типов — значение null.

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

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

Статические классы содержат только статические члены, в том числе и контруктор, которые храняться в памяти в единственном экземпляре. Поэтому создавать экземпляры класса нет смысла.

Чтобы подчеркнуть этот факт, в первой версии С# для статических классов создавали два конструктора, один - пустой закрытый (private) конструктор, второй - статический конструктор, не имеющий параметров. Первый конструктор предотвращал попытки создания экземпляров класса. Второй конструктор автоматически вызывается системой до первого обращения к любому элементу статического класса, выполняя необходимые действия по инициализации. Вышесказанное отражено в следующем примере:

class Demo

{

static int a;

static int b;

private Demo(){} //закрытый конструктор

static Demo() //статический конструктор

{

a=10;

b=2;

}

public static void Print ()

{

Console.WriteLine("{0}+{1}={2}",a,b,a+b);

Console.WriteLine("{0}*{1}={2}",a,b,a*b);

Console.WriteLine("{0}-{1}={2}",a,b,a-b);

}

}

class Program

{

static void Main()

{

//Demo S=new Demo(); //ошибка содать экземпляр класса нельзя

Demo.Print();

}

}

В версию 2.0 введена возможность описывать статический класс, то есть класс с модификатором static. Экземпляры такого класса создавать запрещено, и кроме того, от него запрещено наследовать. Все элементы такого класса должны явным образом объявляться с модификатором static (константы и вложенные типы классифицируются как статические элементы автоматически). Конструктор эк­земпляра для статического класса задавать запрещается.

static class Demo

{

static int a=20;

static int b=10;

public static void Print ()

{

Console.WriteLine("{0}+{1}={2}",a,b,a+b);

Console.WriteLine("{0}*{1}={2}",a,b,a*b);

Console.WriteLine("{0}-{1}={2}",a,b,a-b);

}

}

class Program

{

static void Main()

{

Demo.Print();

}

}

Деструкторы

В С# существует специальный вид метода, называемый деструктором, который вызывается сборщиком мусора непосредственно перед удалением объекта из памяти.

В деструкторе описываются действия, гарантирующие корректность последую­щего удаления объекта. Например, проверяется все ли ресурсы, используемые объектом, освобождены (файлы закрыты, удаленное соединение разорвано и т. п.).

Синтаксис деструктора:

[атрибуты] [extern] ~имя_класса()

{тело_деструктора}

Деструктор не имеет параметров, не возвращает зна­чения и не требует указания спецификаторов доступа. Его имя совпадает с име­нем класса и предваряется тильдой (~), символизирующей обратные по отноше­нию к конструктору действия. Тело деструктора представляет собой блок или просто точку с запятой. Если деструктор определен как внешний, то используется спецификатор extern.

В общем случае применение деструкторов замедляет процесс сборки мусора. Поэтому создавать деструкторы следует только тогда, когда необходимо освободить какие-то ресурсы перед удалением объекта.

Билет №22. Операции классов

Операции класса

С# позволяет переопределить большинство операций так, чтобы при использовании их объектами конкретного класса выполнялись действия, отличные от стандартных. Это дает возможность применять объекты собственных типов данных в составе выражений, например:

newObject x, y, z;

…

z = x+y; // используется операция сложения, переопределенная для класса newObject

Определение собственных операций класса называют перегрузкой опера­ций. Перегрузка операций обычно применяется для классов, для которых семантика опера­ций делает программу более понятной. Если назначение операции интуитивно непонятно, перегружать такую операцию не рекомендуется.

Операции класса описываются с помощью методов специального вида, синтаксис которых выглядит следующим образом:

[ атрибуты] спецификаторы объявитель_операции

{тело}

При описании операций необходимо соблюдать следующие правила:

  1. операция должна быть описана как открытый статический метод класса (public static);

  2. параметры в операцию должны передаваться по значению (то есть недопустимо использовать параметры ref и out);

  3. сигнатуры всех операций класса должны различаться;

  4. типы, используемые в операции, должны иметь не меньшие права доступа, чем сама операция (то есть должны быть доступны при использовании операции).