Вступ до Destructor в C #

У статті Destructor в C #, як випливає з назви, деструктори - це методи в C #, які знищують об'єкти. Якщо об'єкти більше не потрібні, тоді деструктор покликаний знищити ці об'єкти з класу. Деструктор автоматично викликає сміттєзбірник і знищує предмети.

Синтаксис:

class Demo
(
// other methods
~Demo() // destructor
(
// your code
)
)
C# destructor is a shortcut of Finalize( ) method. So when you declare destructor
~Demo() // destructor
(
// your code
)
C# compiler will translate it to:
protected override void Finalize()
(
try
(
// your code
)
finally
(
base.Finalize();
)
)

Деструктор представлений ~ (tilde).

Властивості деструктора в C #

Нижче наведені властивості деструктора:

  1. У деструкторів не може бути жодних параметрів та модифікаторів доступу.
  2. Кожен клас повинен складатися лише з одного деструктора.
  3. Деструктори не можуть бути перевантажені або успадковані.
  4. Ім'я деструктора завжди те саме, що ім'я класу, і не має типу повернення.
  5. Деструктор використовує метод Finalize і викликається смітником, коли об'єкти більше не потрібні.
  6. Деструктор слідує зворотній схемі. У деструкторі похідний клас називається спочатку, а потім базовим класом.

Як працює Destructor в C #?

Ось кілька прикладів, які показують, як це працює в C #.

Приклад №1

Код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Destructor
(
class person
(
//variables
public string name;
public int age;
public person(string name, int age) //parametrized constructor
(
this.name = name;
this.age = age;
)
public string getName()
(
return this.name;
)
public int getAge()
(
return this.age;
)
~person() // destructor
(
Console.WriteLine("Destructor has been invoked");
)
)
class Program
(
// main method
static void Main(string() args)
(
person Details = new person("Joe", 28);
Console.WriteLine(Details.getName());
Console.WriteLine(Details.getAge());
)
)
)

У наведеному вище прикладі параметризований конструктор ініціалізується з ім'ям параметра та віком, де це ключове слово, що відноситься до змінних класу. Після цього створюється деструктор з тим же ім'ям, що і назва класу та символ ~. В основному методі є об’єкт класової людини. Після отримання імені та віку людини об’єкти більше не потрібні. Так називається деструктор, який руйнує предмети і розподіляє їх пам’ять.

Вихід:

Приклад №2

Код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
anmespace Destructor
(
class person
(
// variables
public string name;
public int age;
public person(string name, int age) // parameterized constructor
(
this.name = name;
this.age = age;
)
public string getName()
(
return this.name;
)
public int getAge()
(
return this.age;
)
~person() //destructor
(
Console.WriteLine("Descructor has been invoked");
)
)
class Program
(
// Main method
static void Main(string() args)
(
person Details = new person("Joe", 28); // first object
person Details1 = new person("John", 20);
Console.WriteLine(Details.getName());
Console.WriteLine(Details.getAge());
Console.WriteLine(Details1.getName());
Console.WriteLine(Details1.getAge());
)
)
)

Цей приклад майже такий же, як і в попередньому прикладі, але в цьому прикладі в основному методі є два об'єкти. Як ми знаємо, конструктор працює для кожного об'єкта, і те саме застосовується і для деструктора. У цьому випадку деструктор викликається два рази і виділяє пам'ять кожного об'єкта.

Вихід:

Приклад №3

Код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Destructor
(
public class Parent
(
~Parent() // base destructor
(
Console.WriteLine("Parent.~Parent()");
)
)
public class Child : Parent
(
~Child() // derived destructor
(
Console.WriteLine("Child.~Child()");
)
)
public class MainClass
(
static void Main()
(
Child child = new Child();
)
)
)

У наведеному вище прикладі визначається батьківський клас, який має деструктор. Потім дочірній клас успадковує батьківський клас і складається також з деструктора. Так дочірній деструктор автоматично викликає базовий деструктор.

У конструкторах основний конструктор називається першим. Наприклад, якщо у нас є базовий клас А, який успадковується класом В, то у випадку конструктора клас А називається спочатку, а потім клас В. Однак у випадку деструктора клас В (похідний клас) викликається спочатку перед класом А ( базовий клас).

Ще один приклад виконання замовлення: -

Код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Destructor
(
class Tree
(
~Tree()
(
System.Console.WriteLine("This is the first destructor");
)
)
class Branch: Tree
(
~Branch()
(
System.Console.WriteLine("This is the second destructor");
)
)
class Flower: Branch
(
~Flower()
(
System.Console.WriteLine("This is the third destructor");
)
)
class Test
(
static void Main()
(
Flower f= new Flower();
)
)
)

Вихід:

Як бачимо, третій конструктор називається спочатку, а за ним другий та перший.

Приклад №4

Код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Destructor
(
class Example
(
public Example()
(
// constructor
Console.WriteLine("Object Created");
)
// Destructor
~Example()
(
Console.WriteLine("Object Destroyed");
)
)
class Program
(
public static void Sample()
(
Example ex = new Example();
)
static void Main(string() args)
(
Sample();
GC.Collect();
Console.ReadLine();
)
)
)

Вихід:

Destructor виділяє пам'ять об'єкта, якщо вони не потрібні в кінці програми. Але іноді, якщо ми використовуємо GC.Collect () в середині виконання програми, вона знищить об'єкти посередині і виділить пам'ять цих об'єктів. Деструктор можна викликати неявно або явно. Але немає необхідності чітко знищувати об'єкти, оскільки C # забезпечує збирання сміття. Однак, коли ви закінчите з керованими ресурсами, вам потрібно буде їх явно звільнити. Немає необхідності називати або використовувати регістр керованих ресурсів. Використовуйте деструктор для обробки некерованих ресурсів. Сміттєзбірник викличе деструктор, оскільки складається з переліку об'єктів, у яких є деструктор. Отже, коли об'єкт створюється або знищується, цей список оновлюється. Якщо в черзі є об’єкт, він збирається сміттєзбірником після виконання деструктора.

Висновок

Основна мета деструктора - звільнити пам’ять предметів після їх виконання. Отже, у деструкторі виконуються різні дії, такі як відновлення простору, звільнення мережевих ресурсів та блокування ресурсів тощо. Деструктори повинні використовуватися для звільнення некерованих ресурсів, а не керованих ресурсів.

Рекомендована стаття

Це було керівництвом Destructor у C #. Тут ми обговорюємо вступ, властивості, а також приклади деструктора в C #. Ви також можете ознайомитися з іншими запропонованими нами статтями, щоб дізнатися більше -

  1. Вступ до Destructor на Java
  2. Спадщина в C # | Топ-4 типи
  3. Копіювання конструктора в C # (приклади)
  4. Що таке багатопотокове читання в C #? | Переваги
  5. Destructor в Python (переваги з прикладом)
  6. Доступ до модифікаторів у PHP
  7. Типи конструктора в C # з реалізацією коду
  8. Створення та методи багатопотокової роботи в C #