C#中的dispose()和finalize()之间的区别

作者: Laura McKinney
创建日期: 2 四月 2021
更新日期: 13 可能 2024
Anonim
Finalize vs Dispose | C# Interview Questions
视频: Finalize vs Dispose | C# Interview Questions

内容


方法dispose()和finalize()是C#的方法,它们被调用以释放对象拥有的非托管资源。 dispose()方法在IDisposable接口内部定义,而finalize()方法在类对象内部定义。 dispose()和finalize()之间的主要区别在于该方法 处置()必须由用户显式调用,而方法 finalize() 在对象被破坏之前由垃圾收集器调用。让我们借助下面显示的比较表研究它们之间的其他差异。

  1. 比较表
  2. 定义
  3. 关键差异
  4. 结论

比较表

比较基础处置()finalize()
已定义方法dispose()在接口IDisposable接口中定义。在java.lang.object类中定义的方法finalize()id。
句法公共无效Dispose(){
//在这里放置代码
}
受保护的void finalize(){
//此处的完成代码
}
调用了 方法dispose()由用户调用。垃圾回收器调用finalize()方法。
目的方法dispose()用于在调用非托管资源时将其释放。方法finalize()用于在对象被破坏之前释放非托管资源。
实作只要有close()方法,就将实现dispose()方法。finalize()方法将用于非托管资源。
访问说明符方法dispose()被声明为public。方法finalize()被声明为私有的。
行动 方法dispose()更快,并且可以立即处理对象。方法确定比配置慢
性能该方法dispose()执行瞬时动作,因此,不影响网站的性能。 finalize()方法较慢会影响网站的性能。


dispose()的定义

dispose()方法释放由该类的对象持有的非托管资源。非托管资源是文件,数据连接等。方法dispose()在接口中声明 可识别 它由类通过实现IDisposable接口来实现。该方法不会自动调用。当您创建供其他人使用的自定义类时,程序员必须手动实现它。该方法具有以下语法:

public void dispose(){//在此处放置代码}

在以上语法中,您可以观察到该方法被声明为public。这是因为此方法是在接口IDisposable中定义的,并且必须由实现此接口的类来实现。因此,为了提供对实现类的可访问性,该方法被声明为public。

在实现调用此方法时,该方法由程序的代码手动调用。该方法的性能很快,并且可以立即释放类对象持有的资源。

finalize()的定义

finalize()方法在 宾语 类。它用于清理活动。当对象的引用长时间不使用时,垃圾收集器将调用此方法。垃圾收集器会自动释放托管资源,但如果要释放文件句柄,数据连接等非托管资源,则必须手动实现finalize方法。垃圾回收器在完全销毁对象之前调用方法finalize()。

方法finalize()的语法:

protected void finalize(){//此处的完成代码}

在上面的语法中,方法finalize()被声明为protected。其背后的原因是,不能从类外部访问finalize()方法,并且只能对垃圾收集器进行访问。

由于finalize()方法不会立即释放内存,因此会影响性能成本。在C#中,使用析构函数自动调用finalize方法。

  1. 方法dispose()在接口中定义 一次性。另一方面,方法finalize()在类中定义 宾语.
  2. 程序员必须在代码内部手动调用dispose()方法,而垃圾回收器在销毁对象之前会自动调用finalize方法。
  3. 方法dispose可以随时调用,而垃圾回收器发现很长一段时间未引用该对象时,则调用finalize方法。
  4. 在实现接口IDisposable之后,在类中实现了dispose()方法。方法finalize()只能用于 非托管资源 因为托管资源会由垃圾收集器自动释放。
  5. 方法dispose()的访问说明符是公共的,因为它是在接口IDisposable中定义的,并且将由实现此接口的类实现,因此,它应该是公共的。另一方面,方法finalize()具有受保护的访问说明符,因此该类之外的任何成员均不应访问它。
  6. 方法dispose()快速并且可以立即释放对象,因此,它不影响性能成本。 finalize()方法比较慢,并且不会立即释放对象所拥有的资源。

结论:

建议使用方法dispose()而不是finalize()方法,因为它比finalize更快。同样,可以在需要时随时调用它。