Wprowadzenie do Destructor w C #

W artykule Destructor w C #, jak sama nazwa wskazuje, destruktory to metody w C #, które niszczą obiekty. Jeśli obiekty nie są już potrzebne, wywoływany jest destruktor w celu zniszczenia tych obiektów z klasy. Destruktor wywoła się automatycznie przez śmietnik i niszczy obiekty.

Składnia:

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

Niszczyciel jest reprezentowany przez ~ (tylda).

Właściwości Destructor w C #

Oto właściwości destruktora:

  1. Niszczyciele nie mogą mieć żadnych parametrów ani modyfikatorów dostępu.
  2. Każda klasa powinna składać się tylko z jednego destruktora.
  3. Niszczycieli nie można przeciążać ani dziedziczyć.
  4. Nazwa niszczyciela jest zawsze taka sama jak nazwa klasy i nie ma typu zwrotu.
  5. Niszczyciel używa metody Finalizacji i wywoływany przez Garbage Collector, gdy obiekty nie są już potrzebne.
  6. Niszczyciel wykonuje odwrotny wzór. W destruktorze klasa pochodna nazywana jest najpierw, a następnie klasa podstawowa.

Jak działa Destructor w C #?

Oto kilka przykładów, które pokazują, jak to działa w języku C #.

Przykład 1

Kod:

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

W powyższym przykładzie sparametryzowany konstruktor jest inicjowany nazwą parametru i wiekiem, gdzie jest to słowo kluczowe odnoszące się do zmiennych klas. Następnie tworzony jest destruktor o tej samej nazwie co nazwa klasy i symbol ~. W metodzie głównej istnieje obiekt osoby z klasy. Po uzyskaniu imienia i wieku osoby przedmioty nie są już wymagane. Tak więc wywoływany jest destruktor, który niszczy obiekty i przydziela ich wspomnienia.

Wynik:

Przykład nr 2

Kod:

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

Ten przykład jest prawie taki sam jak w poprzednim przykładzie, ale w tym przykładzie w metodzie głównej istnieją dwa obiekty. Jak wiemy, konstruktor działa dla każdego obiektu i to samo dotyczy również destruktora. W takim przypadku destruktor jest wywoływany dwa razy i przydziela pamięć każdego obiektu.

Wynik:

Przykład nr 3

Kod:

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

W powyższym przykładzie zdefiniowano klasę nadrzędną, która ma destruktor. Następnie klasa potomna dziedziczy klasę nadrzędną i składa się również z destruktora. Więc destruktor potomny automatycznie wywołuje podstawowy destruktor.

W konstruktorach pierwszy konstruktor jest nazywany. Na przykład, jeśli mamy klasę podstawową A, która jest dziedziczona przez klasę B, więc w przypadku konstruktora klasa A jest nazywana najpierw, a następnie klasa B. Jednak w przypadku destruktora klasa B (klasa pochodna) jest wywoływana najpierw przed klasą A ( klasa podstawowa).

Kolejny przykład realizacji zamówienia: -

Kod:

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

Wynik:

Jak widać, trzeci konstruktor jest początkowo wywoływany przez drugi i pierwszy.

Przykład 4

Kod:

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

Wynik:

Destructor przydziela pamięć obiektu, jeśli nie są one wymagane na końcu programu. Ale czasami, jeśli użyjemy GC.Collect () w trakcie wykonywania programu, zniszczy obiekty w środku i cofnie przydział pamięci tych obiektów. Niszczyciel może być wywoływany niejawnie lub jawnie. Ale nie ma potrzeby jawnego niszczenia obiektów, ponieważ C # zapewnia odśmiecanie. Jednak gdy skończysz z niezarządzanymi zasobami, będziesz musiał je wyraźnie zwolnić. Nie ma potrzeby wywoływania ani zarządzania zasobami. Użyj destruktora do obsługi niezarządzanych zasobów. Garbage Collector wywoła destruktor, ponieważ składa się z listy obiektów, które mają destruktor. Tak więc za każdym razem, gdy obiekt jest tworzony lub niszczony, lista ta jest aktualizowana. Jeśli w kolejce znajduje się obiekt, jest on zbierany przez moduł wyrzucający elementy bezużyteczne po uruchomieniu destruktora.

Wniosek

Głównym celem destruktora jest uwolnienie pamięci obiektów po ich wykonaniu. Dlatego w destruktorze wykonywane są różne działania, takie jak odzyskiwanie przestrzeni, zwalnianie zasobów sieciowych i blokad zasobów itp. Destruktorów należy używać do zwalniania zasobów niezarządzanych zamiast zasobów zarządzanych.

Polecany artykuł

To był przewodnik po Destructor w C #. Tutaj omawiamy wprowadzenie, właściwości, a także Przykłady Destructor w C #. Możesz także przejrzeć nasze inne sugerowane artykuły, aby dowiedzieć się więcej -

  1. Wprowadzenie do Destructor w Javie
  2. Dziedziczenie w C # | 4 najlepsze typy
  3. Kopiuj konstruktora w C # (przykłady)
  4. Co to jest wielowątkowość w C #? | Zalety
  5. Destructor in Python (zalety z przykładem)
  6. Dostęp do modyfikatorów w PHP
  7. Typy konstruktorów w C # z implementacją kodu
  8. Tworzenie i metody wielowątkowości w C #