- •Платформа .Net / Microsoft
- •8. Встроенные типы данных
- •9. Преобразование встроенных типов данных
- •10. Переменные, константы, перечисление. Определение значений переменных.
- •16. Цикл с параметром for
- •17. Операторы присваивания. Составные операторы присваивания
- •11. Строковые переменные. Массивы
- •12. Ветвление программ на языке c#
- •13. Безусловные и условные переходы
- •14. Оператор выбора switch
- •15. Цикл while с предусловием и постусловием
- •18. Операторы сравнения
- •19. Основы обработки исключений
- •20. Понятие «Классы». Спецификаторы
- •21. Методы класса
- •22. Конструкторы экземпляра класса
- •23. Деструкторы
- •24. Свойства экземпляра класса
22. Конструкторы экземпляра класса
Конструкторы экземпляров используются для создания переменных члена экземпляра, если создание объекта class осуществляется с помощью выражения new. Для инициализации класса с модификатором static или статических переменных в нестатическом классе необходимо определить статический конструктор В следующем примере показан конструктор экземпляра.
class CoOrds
{
public int x, y;
// constructor
public CoOrds()
{
x = 0;
y = 0;
}
}
|
Следует пояснить, что этот класс содержит открытые поля. Использование открытых полей не рекомендуется использовать на практике, поскольку в этом случае любой метод в любом месте программы получает неограниченный и неконтролируемый доступ к внутренней работе объекта. Члены данных обычно должны быть закрытыми, а доступ к ним должен осуществляться только посредством методов и свойства класса. |
Этот конструктор экземпляра вызывается каждый раз при создании объекта на базе класса CoOrds. Такой конструктор без аргументов называется конструктором по умолчанию. Зачастую такие конструкторы используются для предоставления дополнительных конструкторов. Например, можно добавить конструктор в класс CoOrds, позволяющий указывать начальные значения для членов данных:
public CoOrds(int x, int y)
{
this.x = x;
this.y = y;
}
Это позволяет создавать объекты CoOrd с начальными значениями по умолчанию или с другими начальными значениями:
CoOrds p1 = new CoOrds();
CoOrds p2 = new CoOrds(5, 3);
Если класс не содержит конструктор, автоматически создается конструктор по умолчанию и для инициализации полей объекта используются значения по умолчанию. Например, int инициализируется значением 0. Следовательно, поскольку конструктор по умолчанию класса CoOrds инициализирует все члены данных с нулевыми значениями, его можно удалить, при этом порядок работы класса не изменится. Конструкторы экземпляров также можно использовать для вызова конструкторов экземпляров базового класса. Конструктор класса может вызвать конструктор базового класса с помощью инициализатора:
class Circle : Shape
{
public Circle(double radius)
: base(radius, 0)
{
}
}
В этом примере класс Circle передает значения радиуса и высоты конструктору, предоставленному классом Shape, для которого класс Circle является производным.
23. Деструкторы
Деструкторы используются для уничтожения экземпляров классов.
В структурах определение деструкторов невозможно. Они применяются только в классах.
Класс может иметь только один деструктор.
Деструкторы не могут наследоваться или перегружаться.
Деструкторы невозможно вызвать. Они запускаются автоматически.
Деструктор не принимает модификаторы и не имеет параметров.
Например, следующая инструкция является объявлением деструктора класса Car:
class Car
{
~Car()
{
}
}
Деструктор неявным образом вызывает метод Finalize для базового класса объекта. Следовательно, предыдущий код деструктора неявным образом преобразуется в следующий код:
protected override void Finalize()
{
try
{
}
finally
{
base.Finalize();
}
}
Это означает, что метод Finalize вызывается рекурсивно для всех экземпляров цепочки наследования начиная с самого дальнего и заканчивая самым первым.
Примечание |
Пустые деструкторы использовать не следует. Если класс содержит деструктор, то в очереди метода Finalize создается запись. При вызове деструктора сборщик мусора выполняет обработку очереди. Если деструктор пустой, это приводит только к ненужному снижению производительности. |
Программист не может управлять моментом вызова деструктора, потому что момент вызова определяется сборщиком мусора. Сборщик мусора проверяет наличие объектов, которые больше не используются приложением. Если считает, что какой-либо объект требует уничтожения, то он вызывает деструктор (при наличии) и освобождает память, используемую для хранения этого объекта.Деструкторы также вызываются при выходе из программы.
Существует возможность принудительно выполнить сборку мусора, вызвав метод Collect, но в большинстве случаев этого следует избегать, потому что это может привести к проблемам с производительностью.
Использование деструкторов для освобождения ресурсов.
В целом, язык C# не требует управления памятью в той степени, в какой это требуется в случае разработки кода на языке, не рассчитанном на среду выполнения со сборкой мусора. Это связано с тем, что сборщик мусора платформы .NET Framework неявным образом управляет выделением и высвобождением памяти для объектов. Однако при инкапсуляции приложением неуправляемых ресурсов, например окон, файлов и сетевых подключений, для высвобождения этих ресурсов следует использовать деструкторы. Если объект требует уничтожения, то сборщик мусора запускает выполнение метода Finalize этого объекта.
Высвобождение ресурсов явным образом
В случае, когда приложением используется ценный внешний ресурс, также рекомендуется обеспечить способ высвобождения этого ресурса явным образом, прежде чем сборщик мусора освободит этот объект. Это выполняется путем реализации метода Dispose интерфейса IDisposable, который выполняет необходимую очистку для объекта. Это может значительно повысить производительность приложения. Даже в случае использования данного явного управления ресурсами деструктор становится резервным средством очистки ресурсов, если вызов метода Dispose не будет выполнен.
