Деструкторы

Статические конструкторы.

Существует второй тип конструкторов — статические конструкторы, или конструкторы класса. Конструктор экземпляра инициализирует данные экземпляра, конструктор класса — данные класса. Статический конструктор не имеет параметров, его нельзя вызвать явным образом. Система сама определяет момент, в который требуется его выполнить. Гарантируется только, что это происходит до создания первого экземпляра объекта и до вызова любого статического метода. Некоторые классы содержат только статические данные, и, следовательно, создавать экземпляры таких объектов не имеет смысла. Чтобы подчеркнуть этот факт, в первой версии С# описывали пустой закрытый ( p r i v a t e ) конструктор. Это предотвращало попытки создания экземпляров класса.

Эти конструкторы инициализируют класс в целом. Никто не знает когда происходит его вызов - гарантируется лишь то, что он будет вызван до создания первого экземпляра класса. Если обычный конструктор вызывается в момент создания экземпляра класса, то статический - в самом начале, т. е. перед созданием первого экземпляра класса.

Статические конструкторы (static constructor) используются для инициализации статических, неизменяемых (readonly) и других полей.

В статическом конструкторе можно задать начальные значения для статических переменных класса. Вот пример:

class MyClass { public static int data; //Статический конструктор static MyClass() { data=10; }//Конструкторpublic MyClass() { data++; } } class Test { public static void Main() { MyClass a=new MyClass(); MyClass b=new MyClass(); System.Console.WriteLine(MyClass.data); } }

Указанный фрагмент выведет на экран 12. Действительно, сначала вызовется статический конструктор, который присвоит значение 10 переменной data. Затем для каждого созданного экземпляра класса MyClass вызовется обычный конструктор, в котором переменная data увеличится каждый раз на 1.

Обратите внимание, что оба конструктора без параметра. Противоречия тут нет, так как один из них - статический, а другой - нет.

Деструктор - это метод, который вызывается при уничтожении объекта. Так как в .NET CLR используется сборщик мусора, нельзя явно удалить определенный экземпляр. Удаление происходит когда никакой код уже не может воспользоваться этим экземпляром. Деструкторы определяются как методы с именем, совпадающим с именем класса, предваренным знаком ~ (тильда):

public class A

{

~A { Console.WriteLine("Меня удаляют!"); }

}

public class Application

{

public static void Main() { A a = new A(); a = null; }

}

Программа выведет: "Меня удаляют!"

Абстрактные методы и классы.

Методы класса могут быть объявлены как абстрактные. Это означает, что в этом классе нет реализации этих методов. Другими словами, такие методы в классе объявлены, но не определены. Абстрактные методы пишутся с применением к ним модификатора abstract. Класс, в котором есть хотя бы один абстрактный метод, тоже называется абстрактным. Следует отметить, что в таком классе могут быть и обычные методы, которые в нем объявлены и определена их реализация. Нельзя создавать экземпляры абстрактного класса - такой класс может использоваться только в качестве базового класса для построения других классов. При этом, для потомка абстрактного класса есть только две возможности - или он реализует все абстрактные методы базового класса (и тогда для такого класса-потомка мы сможем создавать его экземпляры), или он реализует не все абстрактные методы базового класса (и тогда производный класс тоже будет абстрактным классом и единственная возможность его использования - это создавать на его основе другие классы-потомки).