Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_C#.doc
Скачиваний:
38
Добавлен:
15.11.2018
Размер:
2.72 Mб
Скачать

13.6 Один класс - один файл

С добавлением новых классов в программу резко увеличивается ее размер, что затрудняет ее прочтение. Поэтому следует руководствоваться одним простым принципом "один класс - один файл". Для того чтобы создать новый файл для класса Circle выполним следующие действия:

  1. В окне Solution Explorer щелкните правой кнопкой на имени проекта Hello (на рисунке выделен жирным).

  1. Выполните команду Add/Add Class…

В поле Name напишите Сircle.cs и нажмите кнопку Add.

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

А файл Circle.cs выглядит следующим образом:

using System;

namespace ConsoleApplication1

{

public class Circle

{

public Circle()

{

//

// TODO: Add constructor logic here

//

}

}

}

  1. Замените namespace ConsoleApplication1 на namespace MyProgram, для того чтобы идентификаторы файлов Program.cs и Circle.cs были определены в одном пространстве имен.

  2. Перенесите класс Circle из файла Program.cs в файл Circle.cs.

  3. Теперь запустите программу и посмотрите, что она делает.

Самостоятельная работа

Используя дополнительную литературу и Интернет, рассмотрите следующие темы:

  1. Пространства имен: объявление, вложение одного пространства имен в другое, пространства имен, действующие по умолчанию.

  2. Директивы препроцессора из назначение и использование.

13.7. Классы: деструкторы, индексаторы Деструкторы

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

Замечание. Напоминаем, что сборщик мусора удаляет объекты, на которые нет ссылок. Он работает в соответствии со своей внутренней стратегией в неизвестные для программиста моменты времени.

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

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

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

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

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

class DemoArray

{

int[] MyArray;//закрытый массив

string name; //закрытое поле

public DemoArray(int size,int x, string name)//конструктор

{

MyArray = new int[size];

this.name = name;

for (int i=0;i<size; ++i) MyArray[i]=x;

}

public void Print ()//метод

{

Console.Write(name+ " : ");

foreach (int a in MyArray) Console.Write(a+" ");

Console.WriteLine();

}

public int LengthN //свойство

{

get { return MyArray.Length; }

}

~DemoArray()//деструктор

{

Console.WriteLine("сработал деструктор для объекта "+this.name);

}

}

class Program

{

static void Main()

{

DemoArray a= new DemoArray(5,2, "один");

a.Print();

DemoArray b = new DemoArray(6,1, "два");

b.Print();

a = b;

a.Print();

}

}

Задание. Обратите внимание на то, что деструкторы были вызваны автоматически. Дайте объяснение тому, в какой последовательности были вызваны деструкторы.

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