C#析构函数的用法(附带实例)
如果读者设计.NET Framework,在类中可以设计析构(destructor)方法,假设类名称是 Person,则建构方法的名称是 Person(),析构方法的名称是 ~Person(),也就是在建构方法名称前加上“~”符号,即是析构方法。
在 C++的程序概念中,一个类如果不再需要,可以使用析构方法将此类销毁,然后回收内存空间,但是如果程序设计师忘记,则会造成内存的浪费。
在 Java 和 C# 的程序概念中,有内存自动回收机制,我们不必设计析构方法,其自动回收机制会自行处理。
【实例】请创建 .NET Framework 的方案,如下所示:
请按右下方的“下一步”按钮,接着步骤则与之前一样,下列是此程序实例:
但是在 .NET 6.0(或 7.0)下,程序结束前不会调用 ~Person(),所以将看不到上述“调用 Destructor”信息,读者可以参考下面的实例。
【实例 2】使用 .NET 6.0 重新设计实例 1。
使用析构方法需注意下列事项:
在 C++的程序概念中,一个类如果不再需要,可以使用析构方法将此类销毁,然后回收内存空间,但是如果程序设计师忘记,则会造成内存的浪费。
在 Java 和 C# 的程序概念中,有内存自动回收机制,我们不必设计析构方法,其自动回收机制会自行处理。
【实例】请创建 .NET Framework 的方案,如下所示:

请按右下方的“下一步”按钮,接着步骤则与之前一样,下列是此程序实例:
using System; namespace zhangsan { class Person { public string name; public void getName() { Console.WriteLine($"姓名 : {name}"); } ~Person() // Destructor { Console.WriteLine("调用 Destructor"); } } internal class Program { static void Main(string[] args) { Person p = new Person(); p.name = "zhangsan"; p.getName(); } } }运行结果为:
姓名 : zhangsan
调用 Destructor
但是在 .NET 6.0(或 7.0)下,程序结束前不会调用 ~Person(),所以将看不到上述“调用 Destructor”信息,读者可以参考下面的实例。
【实例 2】使用 .NET 6.0 重新设计实例 1。
Person p = new Person(); p.name = "zhangsan"; p.getName(); class Person { public string name; public void getName() { Console.WriteLine($"姓名 : {name}"); } ~Person() // Destructor { Console.WriteLine("调用 Destructor"); } }执行结果为:
姓名 : zhangsan
使用析构方法需注意下列事项:
- 析构方法不可以在 struct 内定义,只能在 class 内使用;
- 一个类只能有一个析构方法;
- 析构方法不能有存取修饰词或参数;
- 析构方法不可以被继承或重载;
- 析构方法不可以被调用。