Введение в деструктор в C #

В статье «Деструктор в 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();
)
)

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

Свойства деструктора в C #

Ниже приведены свойства деструктора:

  1. Деструкторы не могут иметь никаких параметров и модификаторов доступа.
  2. Каждый класс должен состоять только из одного деструктора.
  3. Деструкторы не могут быть перегружены или унаследованы.
  4. Имя деструктора всегда совпадает с именем класса и не имеет возвращаемого типа.
  5. Деструктор использует метод Finalize и вызывается сборщиком мусора, когда объекты больше не нужны.
  6. Деструктор следует по обратной схеме. В деструкторе производный класс сначала вызывается, а затем - базовый класс.

Как работает деструктор в 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());
)
)
)

В приведенном выше примере параметризованный конструктор инициализируется именем параметра и возрастом, где это ключевое слово относится к переменным класса. После этого создается деструктор с тем же именем, что и имя класса и символ ~. В основном методе есть объект класса person. После получения имени и возраста человека, объекты больше не требуются. Так называется деструктор, который разрушает объекты и освобождает их память.

Выход:

Пример № 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());
)
)
)

Этот пример почти такой же, как и в предыдущем примере, но в этом примере в методе main есть два объекта. Как мы знаем, конструктор работает для каждого объекта, и то же самое применяется и для деструктора. В этом случае деструктор вызывается два раза и освобождает память каждого объекта.

Выход:

Пример № 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();
)
)
)

В вышеприведенном примере определен родительский класс, который имеет деструктор. Тогда дочерний класс наследует родительский класс и тоже состоит из деструктора. Таким образом, дочерний деструктор автоматически вызывает базовый деструктор.

В конструкторах базовый конструктор вызывается первым. Например, если у нас есть базовый класс A, который наследуется классом B, то в случае конструктора класс A сначала вызывается, а затем класс B. Однако в случае деструктора класс B (производный класс) сначала вызывается перед классом A ( базовый класс).

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

Код:

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();
)
)
)

Выход:

Деструктор освобождает память объекта, если они не требуются в конце программы. Но иногда, если мы используем GC.Collect () в середине выполнения программы, он уничтожает объекты в середине и освобождает память этих объектов. Деструктор может быть вызван неявно или явно. Но нет необходимости явно уничтожать объекты, так как C # обеспечивает сборку мусора. Однако, когда вы покончили с неуправляемыми ресурсами, вам нужно будет явно их освободить. Нет необходимости звонить или заниматься делами управляемых ресурсов. Используйте деструктор для обработки неуправляемых ресурсов. Сборщик мусора вызовет деструктор, поскольку он состоит из списка объектов, имеющих деструктор. Таким образом, всякий раз, когда объект создается или уничтожается, этот список обновляется. Если в очереди есть объект, он собирается сборщиком мусора после выполнения деструктора.

Вывод

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

Рекомендуемая статья

Это было руководство к деструктору в C #. Здесь мы обсуждаем введение, свойства, а также примеры деструктора в C #. Вы также можете просмотреть наши другие предлагаемые статьи, чтобы узнать больше -

  1. Введение в деструктор в Java
  2. Наследование в C # | Лучшие 4 Типа
  3. Конструктор копирования в C # (примеры)
  4. Что такое многопоточность в C #? | преимущества
  5. Деструктор в Python (преимущества с примером)
  6. Модификаторы доступа в PHP
  7. Типы конструктора в C # с реализацией кода
  8. Создание и методы многопоточности в C #