
17 Classes
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 destructorsince 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.
| |
| Jagger Software Ltd | |
| Company # 4070126 | |
| VAT # 762 5213 42 |