Jon Jagger
jon@jaggersoft.com
Table of Contents 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 Notes DownloadECMA-334 C# Language Specificationpreviousnextprevious at this levelnext at this level 17 Classesprevious at this levelnext at this level 17.12 Destructors Paragraph 11 A destructor is a member that implements the actions required to destruct an instance of a class. 2 A destructor is declared using a destructor-declaration: destructor-declaration : attributesopt externopt ~ identifier ( ) destructor-body destructor-body : block ; Paragraph 21 A destructor-declaration may include a set of attributes (§24). Paragraph 31 The identifier of a destructor-declarator must name the class in which the destructor is declared. 2 If any other name is specified, a compile-time error occurs. Paragraph 41 When a destructor declaration includes an extern modifier, the destructor is said to be an external destructor. 2 Because an external destructor declaration provides no actual implementation, its destructor-body consists of a semicolon. 3 For all other destructors, the destructor-body consists of a block, which specifies the statements to execute in order to destruct an instance of the class. 4 A destructor-body corresponds exactly to the method-body of an instance method with a void return type (§17.5.8). Paragraph 51 Destructors are not inherited. 2 Thus, a class has no destructors other than the one which may be declared in that class. [Note: Since a destructor is required to have no parameters, it cannot be overloaded, so a class can have, at most, one destructor. end note] Paragraph 61 Destructors are invoked automatically, and cannot be invoked explicitly. 2 An instance becomes eligible for destruction when it is no longer possible for any code to use that instance. 3 Execution of the destructor for the instance may occur at any time after the instance becomes eligible for destruction. 4 When an instance is destructed, the destructors in that instance's inheritance chain are called, in order, from most derived to least derived [Example: The output of the example
using System;  
class A  
{  
   ~A() {  
      Console.WriteLine("A's destructor");  
   }  
}  
class B: A  
{  
   ~B() {  
      Console.WriteLine("B's destructor");  
   }  
}  
class Test  
{  
   static void Main() {  
      B b = new B();  
      b = null;  
      GC.Collect();  
      GC.WaitForPendingFinalizers();  
   }  
}  
is
B's destructor  
A's destructor  
since destructors in an inheritance chain are called in order, from most derived to least derived. end example]
5 Destructors may be implemented by overriding the virtual method Finalize on System.Object. 6 In any event, C# programs are not permitted to override this method or call it (or overrides of it) directly. [Example: For instance, the program
class A  
{  
   override protected void Finalize() {}  // error  
   public void F() {  
      this.Finalize();   // error  
   }  
}  
contains two errors. end example]
7 The compiler behaves as if this method, and overrides of it, does not exist at all. [Example: Thus, this program:
class A  
{  
   void Finalize() {}   // permitted  
}  
is valid and the method shown hides System.Object's Finalize method. end example]
8 For a discussion of the behavior when an exception is thrown from a destructor, see §23.3.
{ JSL }
Jagger Software Ltd
Company # 4070126
VAT # 762 5213 42
Valid HTML 4.01Valid CSS