Table of Contents
Properties of Destructor in C#
How does Destructor work in C#?
Example #4
Conclusion
 Recommended Article

Destructor in C#

Sep 03, 2024 pm 03:12 PM
c# c# tutorial

In the article Destructor in C# as the name suggests, destructors are the methods in C# which destroy the objects. If the objects are no longer required, then the destructor is called to destroy those objects from the class. The destructor will invoke automatically by the garbage collector and destroys objects.

Syntax:

class Demo
{
// other methods
~Demo()  // destructor
{
// your code
}
}
Copy after login

C# destructor is a shortcut of Finalize( ) method. So when you declare destructor

~Demo()   // destructor
{
// your code
}
Copy after login

C# compiler will translate it to:

protected override void Finalize()
{
try
{
// your code
}
finally
{
base.Finalize();
}
}
Copy after login

Destructor is represented by ~ (tilde).

Properties of Destructor in C#

The following are the properties of destructor:

  1. Destructors cannot have any parameters and access modifiers.
  2. Each class should consist of only one destructor.
  3. Destructors cannot be overloaded or inherited.
  4. The destructor name is always the same as the class name and has no return type.
  5. Destructor uses the Finalize method and invoked by Garbage Collector when objects are no longer required.
  6. Destructor follows the reverse pattern. In the destructor, the derived class is called first and then base class.

How does Destructor work in C#?

Here are some examples which show how it works in C#.

Example #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());
}
}
}
Copy after login

In the above example, the parameterized constructor is initialized with parameter name and age where this is a keyword referring to class variables. After that destructor is created with the same name as the class name and symbol ~. In the main method, there is an object of the class person. After getting a person’s name and age, objects are no longer required. So destructor is being called which destroys the objects and de-allocate their memories.

Output:

Destructor in C#

Example #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());
}
}
}
Copy after login

This example is almost the same as the previous example, but in this example, there are two objects in the main method. As we know, the constructor runs for every object and this same thing is applied to the destructor also. In this case, the destructor is being called two times and de-allocates the memory of each object.

Output:

Destructor in C#

Example #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();
}
}
}
Copy after login

In the above example, the parent class is defined which has a destructor. Then the child class inherits parent class and consists of a destructor too. So child destructor automatically calls the base destructor.

In constructors, the base constructor is called first. For example, if we have base class A which is inherited by class B so in case of constructor class A is called first and then class B. However, in the case of destructor class B (derived class) is called first before class A (base class).

Another example of order execution:-

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();
}
}
}
Copy after login

Output:

Destructor in C#

As you can see, the third constructor is called initially followed by the second and the first.

Example #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();
}
}
}
Copy after login

Output:

Destructor in C#

Destructor de-allocates the memory of the object if they are not required at the end of the program. But sometimes if we use GC.Collect() in the middle of program execution, it will destroy objects in the middle and de-allocates the memory of those objects. Destructor can be called implicitly or explicitly. But there is no need to destroy the objects explicitly as C# provides garbage collection. However, when you are done with the unmanaged resources, you will need to free them explicitly. There is no need to called or case of managed resources. Use destructor for handling unmanaged resources. A garbage Collector will call a destructor as it consists of a list of objects that have a destructor. So whenever an object is created or destroyed, that list is updated. If there is an object in the queue, it is collected by the garbage collector after the destructor executes.

Conclusion

The main purpose of the destructor is to free the memory of objects after their execution. So there are different actions executed in the destructor like recovering the space, releasing network resources and resource locks, etc. Destructors should be used to release unmanaged resources rather than managed resources.

 Recommended Article

This has been a guide to Destructor in C#. Here we discuss the introduction, properties as well as Examples of Destructor in C#. You can also go through our other suggested articles to learn more –

  1. Destructor in Java
  2. Inheritance in C#
  3. Copy Constructor in C# 
  4. Destructor in Python

The above is the detailed content of Destructor in C#. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Hot Topics

Java Tutorial
1664
14
PHP Tutorial
1268
29
C# Tutorial
1242
24
Active Directory with C# Active Directory with C# Sep 03, 2024 pm 03:33 PM

Guide to Active Directory with C#. Here we discuss the introduction and how Active Directory works in C# along with the syntax and example.

Random Number Generator in C# Random Number Generator in C# Sep 03, 2024 pm 03:34 PM

Guide to Random Number Generator in C#. Here we discuss how Random Number Generator work, concept of pseudo-random and secure numbers.

C# Data Grid View C# Data Grid View Sep 03, 2024 pm 03:32 PM

Guide to C# Data Grid View. Here we discuss the examples of how a data grid view can be loaded and exported from the SQL database or an excel file.

Factorial in C# Factorial in C# Sep 03, 2024 pm 03:34 PM

Guide to Factorial in C#. Here we discuss the introduction to factorial in c# along with different examples and code implementation.

The difference between multithreading and asynchronous c# The difference between multithreading and asynchronous c# Apr 03, 2025 pm 02:57 PM

The difference between multithreading and asynchronous is that multithreading executes multiple threads at the same time, while asynchronously performs operations without blocking the current thread. Multithreading is used for compute-intensive tasks, while asynchronously is used for user interaction. The advantage of multi-threading is to improve computing performance, while the advantage of asynchronous is to not block UI threads. Choosing multithreading or asynchronous depends on the nature of the task: Computation-intensive tasks use multithreading, tasks that interact with external resources and need to keep UI responsiveness use asynchronous.

Patterns in C# Patterns in C# Sep 03, 2024 pm 03:33 PM

Guide to Patterns in C#. Here we discuss the introduction and top 3 types of Patterns in C# along with its examples and code implementation.

Prime Numbers in C# Prime Numbers in C# Sep 03, 2024 pm 03:35 PM

Guide to Prime Numbers in C#. Here we discuss the introduction and examples of prime numbers in c# along with code implementation.

C# vs. C  : History, Evolution, and Future Prospects C# vs. C : History, Evolution, and Future Prospects Apr 19, 2025 am 12:07 AM

The history and evolution of C# and C are unique, and the future prospects are also different. 1.C was invented by BjarneStroustrup in 1983 to introduce object-oriented programming into the C language. Its evolution process includes multiple standardizations, such as C 11 introducing auto keywords and lambda expressions, C 20 introducing concepts and coroutines, and will focus on performance and system-level programming in the future. 2.C# was released by Microsoft in 2000. Combining the advantages of C and Java, its evolution focuses on simplicity and productivity. For example, C#2.0 introduced generics and C#5.0 introduced asynchronous programming, which will focus on developers' productivity and cloud computing in the future.

See all articles