Csharp/CSharp Tutorial/Class/destructor

Материал из .Net Framework эксперт
Перейти к: навигация, поиск

Base destructor

<source lang="csharp">using System; public class Base {

  ~Base()
  {
     Console.WriteLine( "Base.~Base()" );
  }

} public class Derived : Base {

  ~Derived()
  {
     Console.WriteLine( "Derived.~Derived()" );
  }

} public class MainClass {

  static void Main()
  {
     Derived derived = new Derived();
  }

}</source>

Derived.~Derived()
Base.~Base()

Demonstrate a destructor.

<source lang="csharp">using System;

class Destruct {

 public int x;  
 
 public Destruct(int i) {  
   x = i;  
 }    

 // called when object is recycled 
 ~Destruct() { 
   Console.WriteLine("Destructing " + x); 
 } 

}

class DestructDemo {

 public static void Main() {    
   Destruct ob = new Destruct(0); 

   for(int i=1; i < 100; i++){ 
      Destruct o = new Destruct(i); 
   }
   Console.WriteLine("Done"); 
 }    

}</source>

Done
Destructing 99
Destructing 0
Destructing 98
Destructing 97
Destructing 96
Destructing 95
Destructing 94
Destructing 93
Destructing 92
Destructing 91
Destructing 90
Destructing 89
Destructing 88
Destructing 87
Destructing 86
Destructing 85
Destructing 84
Destructing 83
Destructing 82
Destructing 81
Destructing 80
Destructing 79
Destructing 78
Destructing 77
Destructing 76
Destructing 75
Destructing 74
Destructing 73
Destructing 72
Destructing 71
Destructing 70
Destructing 69
Destructing 68
Destructing 67
Destructing 66
Destructing 65
Destructing 64
Destructing 63
Destructing 62
Destructing 61
Destructing 60
Destructing 59
Destructing 58
Destructing 57
Destructing 56
Destructing 55
Destructing 54
Destructing 53
Destructing 52
Destructing 51
Destructing 50
Destructing 49
Destructing 48
Destructing 47
Destructing 46
Destructing 45
Destructing 44
Destructing 43
Destructing 42
Destructing 41
Destructing 40
Destructing 39
Destructing 38
Destructing 37
Destructing 36
Destructing 35
Destructing 34
Destructing 33
Destructing 32
Destructing 31
Destructing 30
Destructing 29
Destructing 28
Destructing 27
Destructing 26
Destructing 25
Destructing 24
Destructing 23
Destructing 22
Destructing 21
Destructing 20
Destructing 19
Destructing 18
Destructing 17
Destructing 16
Destructing 15
Destructing 14
Destructing 13
Destructing 12
Destructing 11
Destructing 10
Destructing 9
Destructing 8
Destructing 7
Destructing 6
Destructing 5
Destructing 4
Destructing 3
Destructing 2
Destructing 1

Destructors

  1. A destructor method called just prior to an object"s final destruction by the garbage collector.
  2. A destructor can be used to ensure that an object terminates cleanly.
  3. Destructors have this general form:


<source lang="csharp">~class-name( ) { // destruction code }</source>

class-name is the name of the class.

Illustrates a destructor

<source lang="csharp">public class Car {

 ~Car()
 {
   System.Console.WriteLine("In ~Car() destructor");
 }

} class MainClass {

 public static void Main()
 {
   Car myCar = new Car();
   System.Console.WriteLine("At the end of Main()");
 }

}</source>

At the end of Main()
In ~Car() destructor

Simple Finalize

<source lang="csharp">using System; class MyClass {

 ~MyClass()
 {
   Console.WriteLine("Finalizing");
 }

} class MainClass {

 static void Main(string[] args)
 {
   MyClass fc = new MyClass();
   Console.WriteLine("Exiting main");
 }

}</source>

Exiting main
Finalizing

Update static field in the deconstructor

<source lang="csharp">public class MyClass {

 private static int numberOfMyClass = 0;
 public MyClass()
 {
   System.Console.WriteLine("Creating a MyClass object");
   numberOfMyClass++;  
 }
 ~MyClass()
 {
   System.Console.WriteLine("Destroying a MyClass object");
   numberOfMyClass--;  // decrement numberOfMyClass
 }
 public static int GetNumberOfMyClass()
 {
   return numberOfMyClass;
 }

}

class MainClass {

 public static void Main()
 {
   System.Console.WriteLine("MyClass.GetNumberOfMyClass() = " + MyClass.GetNumberOfMyClass());
   MyClass myMyClass = new MyClass();
   System.Console.WriteLine("MyClass.GetNumberOfMyClass() = " + MyClass.GetNumberOfMyClass());
   MyClass myMyClass2 = new MyClass();
   System.Console.WriteLine("MyClass.GetNumberOfMyClass() = " + MyClass.GetNumberOfMyClass());
 }

}</source>

MyClass.GetNumberOfMyClass() = 0
Creating a MyClass object
MyClass.GetNumberOfMyClass() = 1
Creating a MyClass object
MyClass.GetNumberOfMyClass() = 2
Destroying a MyClass object
Destroying a MyClass object

Use destructor and implement IDisposable

<source lang="csharp">using System; public class MyClass : IDisposable {

 ~MyClass()
 {
   Console.WriteLine("In destructor");
 }
 
 public void Dispose()
 {
   Console.WriteLine("In Dispose()");
   GC.SuppressFinalize(this);
 }

} public class MainClass {

 public static void Main(string[] args)
 {    
   MyClass c1, c2, c3, c4;
   c1 = new MyClass();
   c2 = new MyClass();
   c3 = new MyClass();
   c4 = new MyClass();
   
   Console.WriteLine("\n***** Disposing c1 and c3 *****");
   c1.Dispose();
   c3.Dispose();
 }

}</source>

***** Disposing c1 and c3 *****
In Dispose()
In Dispose()
In destructor
In destructor