C# 中的 Dispose 与 Finalize

17 Mar 2025 | 5 分钟阅读

C# 中的 dispose() 和 finalize() 方法用于释放对象所持有的非托管资源。dispose() 方法定义在 IDisposable 接口中,而 finalize() 方法定义在类对象中。这两种方法的主要区别在于,dispose() 方法必须由用户显式调用。而 垃圾回收器 (GC) 则在对象销毁前调用 finalize() 方法。

在本文中,您将了解 dispose()finalize() 之间的区别。但在讨论区别之前,您必须了解主要的 dispose() 和 finalize() 及其语法。

什么是 Dispose()?

dispose() 方法用于释放类对象所拥有的任何非托管资源。非托管资源包括文件、数据连接等。dispose() 函数定义在 IDisposeable 接口中,类通过实现 IDisposable 接口来定义它。它不是默认调用的,当创建供他人使用的自定义类时,程序员必须手动实现它。

语法

Dispose() 方法的语法如下。

您可以看到,上面的代码中该方法被定义为 public。这是因为该函数定义在 IDisposable 接口中,并且必须由实现该接口的类执行。因此,该方法被设为 public 以允许实现该接口的类进行访问。

程序员代码手动调用此方法,因为它是为调用而实现的。该方法速度很快,可以立即释放类对象所持有的资源。

什么是 Finalize()?

finalize() 方法定义在 object 类中。它用于清理目的。当对象的引用长时间未使用时,垃圾回收器会调用此函数。垃圾回收器 (GC) 会自动释放托管资源。如果您想释放非托管资源(如文件管理器、数据连接等),则必须手动实现 finalize() 方法。GC 会在对象完全销毁前不久调用 finalize() 方法。

finalize() 方法是通过析构函数执行的。java.lang.object 类定义了 finalize() 方法。该方法被标记为 protected,而不是 public,以防止其他类访问它。finalize() 方法可能会降低程序速度,因为它不会立即释放内存。

语法

Finalize() 方法的语法如下。

在上面的语法中,finalize() 函数被标记为 protected。主要原因在于,finalize() 函数不能从类外部访问,只能由垃圾回收器访问。

finalize() 函数会对性能产生影响,因为它不会立即释放内存。在 C# 中使用析构函数,finalize() 方法会被自动调用。

Dispose() 和 Finalize() 的主要区别

Difference between Dispose and Finalize in C#

Dispose()Finalize() 方法之间有几个关键区别。Dispose() 和 Finalize() 方法之间的一些主要区别如下:

  1. dispose() 方法定义在 IDisposable 接口中。而 finalize() 方法定义在类对象中。
  2. 实现 IDisposable 接口后,dispose() 方法在类中实现。而 finalize() 方法仅为非托管资源实现,因为垃圾回收器会自动释放托管资源。
  3. dispose() 方法会立即释放对象,速度很快,因此对性能没有影响。而 finalize() 方法速度较慢,不会立即释放对象所拥有的资源。
  4. 程序员必须在代码中显式调用 discard() 方法。而垃圾回收器会在销毁对象之前自动调用 finalize() 方法。
  5. dispose() 方法的访问修饰符是 public,因为它定义在 IDisposable 接口中,并将由实现该接口的类执行。因此,它必须是 public。而 finalize() 方法包含 protected 访问修饰符,这意味着它不应被类外部的任何成员访问。
  6. Dispose() 方法没有性能影响。而 Finalize() 方法与性能成本相关,因为它不会自动清除内存,也不会被 GC 自动调用。
  7. dispose() 方法可以随时调用。而垃圾回收器会在发现对象长时间未被引用时调用 finalize() 方法。
  8. discard() 方法对应用程序速度没有影响。而 finalize() 方法可能会降低程序性能。

Dispose() 和 Finalize() 的对比比较

在这里,您将了解 Dispose() 和 Finalize() 方法之间的对比比较。Dispose() 和 Finalize() 方法之间的主要区别如下。

特点Dispose() 方法Finalize() 方法
定义它定义在 IDisposable 接口中。它定义在 java.lang.object 类中。
基本功能它用于关闭或释放对象持有的非托管资源,如文件或流。它用于在销毁当前对象之前清理该对象拥有的非托管资源。
语法dispose() 方法的语法是
public void Dispose( ){
//在此处放置 Dispose 代码
}
finalize() 方法的语法是
protected void finalize( ){
//在此处写入 finalize 代码
}
访问修饰符它被声明为 public。它被声明为 private。
调用由用户调用。由垃圾回收器 (GC) 调用。
速度调用速度非常快。调用速度比 dispose() 方法慢。
性能它会立即执行操作,并且对站点的性能没有影响。它对站点的性能有影响。
实施每次调用 close() 函数时,都应实现 dispose() 方法。必须使用 finalize() 方法实现非托管资源。

结论

本文解释了 C# 中 dispose() 和 finalize() 方法之间的区别。这些方法的主要区别在于,dispose() 必须由程序员显式调用。而 finalize() 方法则由 GC 在对象销毁前调用。建议使用 dispose() 方法而不是 finalize() 方法,因为它速度更快。它也可以在需要时调用。


下一主题区别