Einführung in Destructor in C #

Im Artikel Destruktor in C # sind Destruktoren, wie der Name schon sagt, die Methoden in C #, die die Objekte zerstören. Wenn die Objekte nicht mehr benötigt werden, wird der Destruktor aufgerufen, um diese Objekte aus der Klasse zu zerstören. Der Destruktor wird vom Garbage Collector automatisch aufgerufen und zerstört Objekte.

Syntax:

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

Der Destruktor wird durch ~ (Tilde) dargestellt.

Eigenschaften des Destruktors in C #

Folgendes sind die Eigenschaften des Destruktors:

  1. Destruktoren können keine Parameter und Zugriffsmodifikatoren haben.
  2. Jede Klasse sollte nur aus einem Destruktor bestehen.
  3. Destruktoren können nicht überladen oder vererbt werden.
  4. Der Destruktorname ist immer derselbe wie der Klassenname und hat keinen Rückgabetyp.
  5. Destruktor verwendet die Finalize-Methode und wird von Garbage Collector aufgerufen, wenn Objekte nicht mehr benötigt werden.
  6. Destruktor folgt dem umgekehrten Muster. In destructor wird die abgeleitete Klasse zuerst und dann die Basisklasse aufgerufen.

Wie funktioniert Destruktor in C #?

Hier sind einige Beispiele, die zeigen, wie es in C # funktioniert.

Beispiel 1

Code:

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

Im obigen Beispiel wird der parametrisierte Konstruktor mit dem Parameternamen und dem Alter initialisiert, wobei es sich um ein Schlüsselwort handelt, das auf Klassenvariablen verweist. Danach wird der Destruktor mit demselben Namen wie der Klassenname und das Symbol ~ erstellt. In der Hauptmethode gibt es ein Objekt der Klassenperson. Nachdem Sie den Namen und das Alter einer Person erhalten haben, werden keine Objekte mehr benötigt. Es wird also Destruktor genannt, der die Objekte zerstört und ihre Erinnerungen aufhebt.

Ausgabe:

Beispiel # 2

Code:

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

Dieses Beispiel ist fast identisch mit dem vorherigen Beispiel, in diesem Beispiel befinden sich jedoch zwei Objekte in der Hauptmethode. Wie wir wissen, wird der Konstruktor für jedes Objekt ausgeführt, und dasselbe gilt auch für den Destruktor. In diesem Fall wird der Destruktor zweimal aufgerufen und der Speicher für jedes Objekt freigegeben.

Ausgabe:

Beispiel # 3

Code:

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

Im obigen Beispiel wird die Elternklasse definiert, die einen Destruktor hat. Dann erbt die untergeordnete Klasse die übergeordnete Klasse und besteht ebenfalls aus einem Destruktor. Der untergeordnete Destruktor ruft daher automatisch den Basisdestruktor auf.

In Konstruktoren wird der Basiskonstruktor zuerst aufgerufen. Wenn wir zum Beispiel eine Basisklasse A haben, die von der Klasse B geerbt wird, wird im Falle eines Konstruktors zuerst die Klasse A und dann die Klasse B aufgerufen. Im Falle eines Destruktors wird die Klasse B (abgeleitete Klasse) jedoch zuerst vor der Klasse A aufgerufen ( Basisklasse).

Ein weiteres Beispiel für die Ausführung von Aufträgen:

Code:

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

Ausgabe:

Wie Sie sehen, wird der dritte Konstruktor zunächst aufgerufen, gefolgt von dem zweiten und dem ersten.

Beispiel # 4

Code:

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

Ausgabe:

Destructor gibt den Speicher des Objekts frei, wenn sie am Ende des Programms nicht benötigt werden. Aber manchmal, wenn wir GC.Collect () in der Mitte der Programmausführung verwenden, werden Objekte in der Mitte zerstört und der Speicher dieser Objekte freigegeben. Destruktor kann implizit oder explizit aufgerufen werden. Es ist jedoch nicht erforderlich, die Objekte explizit zu zerstören, da C # die Garbage Collection bereitstellt. Wenn Sie jedoch mit den nicht verwalteten Ressourcen fertig sind, müssen Sie sie explizit freigeben. Es ist nicht erforderlich, verwaltete Ressourcen anzurufen oder zu verwalten. Verwenden Sie den Destruktor für den Umgang mit nicht verwalteten Ressourcen. Der Garbage Collector ruft den Destruktor auf, da er aus einer Liste von Objekten besteht, die einen Destruktor haben. Wenn also ein Objekt erstellt oder zerstört wird, wird diese Liste aktualisiert. Befindet sich ein Objekt in der Warteschlange, wird es vom Garbage Collector erfasst, nachdem der Destruktor ausgeführt wurde.

Fazit

Der Hauptzweck des Destruktors besteht darin, den Speicher von Objekten nach ihrer Ausführung freizugeben. Daher werden im Destruktor verschiedene Aktionen ausgeführt, z. B. das Wiederherstellen des Speicherplatzes, das Freigeben von Netzwerkressourcen und Ressourcensperren usw. Destruktoren sollten verwendet werden, um nicht verwaltete Ressourcen, sondern verwaltete Ressourcen freizugeben.

Empfohlener Artikel

Dies war eine Anleitung zu Destructor in C #. Hier diskutieren wir die Einführung, Eigenschaften sowie Beispiele für Destruktor in C #. Sie können auch unsere anderen Artikelvorschläge durchgehen, um mehr zu erfahren -

  1. Einführung in Destructor in Java
  2. Vererbung in C # | Top 4 Arten
  3. Konstruktor in C # kopieren (Beispiele)
  4. Was ist Multithreading in C #? | Vorteile
  5. Destruktor in Python (Vorteile mit Beispiel)
  6. Zugriffsmodifikatoren in PHP
  7. Arten von Konstruktoren in C # mit Code-Implementierung
  8. Erstellung und Methoden des Multithreading in C #