Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Экзамен в гаи redacted.doc
Скачиваний:
5
Добавлен:
27.09.2019
Размер:
676.35 Кб
Скачать

3. Что будет выведено в консоли в результате выполнения следующего кода (и почему):

byte b1 = 1, b2 = 2;

byte b3 =(byte)(b1 + b2);

if (b3 > b1) Console.WriteLine("OK!");

else Console.WriteLine("wow!");

Ответ: выведет OK! Никакой проблемы нет, по-моему, т.к. 3>1

Экзаменационный билет №6

1. Конструкторы, их виды (преобразования, умолчания, копирования). Деструктор.

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

Базовая инициализация объекта осуществляется автоматически. Например, забо­титься о поиске того места в памяти, в котором сможет уместиться новый объект, не нужно. Однако иногда бывает необходимо, чтобы на стадии инициализации объекта выполнялись какие-то дополнительные задачи, например, инициализация хранимых объектом данных. Для осуществления подобного применяется функция-конструктор.

Все объекты имеют конструктор по умолчанию, который представляет собой не при­нимающий параметров метод с таким же именем, как у самого класса. Определение класса может также включать несколько методов-конструкторов, принимающих пара­метры и отличных от конструктора по умолчанию. Такие конструкторы позволяют создавать экземпляр объекта различными способами, например, предоставляя началь­ные значения для хранимых в объекте данных.

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

CupOfCoffee myCup = new CupOfCoffee();

Экземпляры объектов могут также создаваться и с помощью конструкторов не по умолчанию. Например, у класса CupOfCoffee мог бы существовать конструктор не по умолчанию, принимающий параметр для установки во время создания экземпляра типа кофейных зерен:

CupOfCoffee myCup = new CupOfCoffee("Blue Mountain");

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

Некоторые классы не имеют общедоступных конструкторов, что делает невозмож­ным создание их экземпляров внешним кодом (такие классы называются не создаваемыми).

public class MyBaseClass

{

public MyBaseClass () { }

public MyBaseClass (int i) { }

}

public class MyDerivedClass : MyBaseClass {

public MyDerivedClass ();

public MyDerivedClass(int k);

public MyDerivedClass(int i, int j);

}

В такой иерархии экземпляр класса MyDerivedClass может создаваться так:

MyDerivedClass myObj = new MyDerivedClass();

Тогда последовательность происходящих событий будет выглядеть следующим об­разом:

  1. Сначала будет выполняться код конструктора System.Object.Object.

  2. Затем будет выполняться код конструктора MyBaseClass.MyBaseClass.

  3. И, наконец, последним будет выполняться код конструктора MyDerivedClass.MyDerivedClass.

Деструкторы. Деструкторы используются в .NET Framework для выполнения очистки после уда­ления объектов. В целом предоставлять код для метода-деструктора не требуется; это делается автоматически. Однако можно предоставлять специфические инструкции, если необходимо, чтобы перед удалением экземпляра объекта выполнялись какие-ни­будь важные операции.

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

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

class MyClass {

~MyClass () {

// Тело деструктора.

}

}