.net Dispose方法是否在内部自动调用Finalize方法?

.net Dispose方法是否在内部自动调用Finalize方法?,.net,asp.net,.net,Asp.net,Dispose方法是否在内部自动调用Finalize方法?如果是,如何处理?Dispose方法不会自动调用终结器。此外,终结器不会自动调用Dispose方法 有关更多信息,请参见此问题: Dispose方法不会自动调用终结器。此外,终结器不会自动调用Dispose方法 有关更多信息,请参见此问题: 处理和最终确定是不同的事情。两者都不调用对方 很可能你的类甚至不需要终结器。您应该构建终结器的唯一时间是在构建类以使用全新类型的非托管资源时。例如,如果您正在构建一个数据库访问类,该类将使用Sql S

Dispose方法是否在内部自动调用Finalize方法?如果是,如何处理?

Dispose方法不会自动调用终结器。此外,终结器不会自动调用Dispose方法

有关更多信息,请参见此问题:


Dispose方法不会自动调用终结器。此外,终结器不会自动调用Dispose方法

有关更多信息,请参见此问题:


处理和最终确定是不同的事情。两者都不调用对方

很可能你的类甚至不需要终结器。您应该构建终结器的唯一时间是在构建类以使用全新类型的非托管资源时。例如,如果您正在构建一个数据库访问类,该类将使用Sql Server、MySql等现有的ADO.Net提供程序,则不需要终结器。您不应该构建终结器,因为已经为底层提供程序编写的终结器将为您进行清理。但是,如果您正在为一种全新的数据库构建ADO.Net提供程序,或者在完全不依赖现有代码的情况下从头开始重新实现提供程序,那么您应该实现一个终结器

所以,重复一下:

终结器仅适用于发起非托管资源的类型。它们应该只为一种特定的资源实现一次,并且只能由框架本身调用

Dispose用于包装公开非托管资源的其他类型。它应该在每次持有非托管资源时实现,并为创建的类的每个实例调用


它们都与内存没有任何关系,可能除了非托管代码持有的内存。

Dispose和Finalize是不同的东西。两者都不调用对方

很可能你的类甚至不需要终结器。您应该构建终结器的唯一时间是在构建类以使用全新类型的非托管资源时。例如,如果您正在构建一个数据库访问类,该类将使用Sql Server、MySql等现有的ADO.Net提供程序,则不需要终结器。您不应该构建终结器,因为已经为底层提供程序编写的终结器将为您进行清理。但是,如果您正在为一种全新的数据库构建ADO.Net提供程序,或者在完全不依赖现有代码的情况下从头开始重新实现提供程序,那么您应该实现一个终结器

所以,重复一下:

终结器仅适用于发起非托管资源的类型。它们应该只为一种特定的资源实现一次,并且只能由框架本身调用

Dispose用于包装公开非托管资源的其他类型。它应该在每次持有非托管资源时实现,并为创建的类的每个实例调用


它们都与内存没有任何关系,可能除了非托管代码所持有的内存。

在“实现Finalize和Dispose以清理非托管资源”中,可能重复的,请注意,即使使用Dispose提供显式控制,也应使用Finalize方法提供隐式清理。Finalize提供了一个备份,以防止在程序员未能调用Dispose时资源永久泄漏。”在我看来,他们好像在说,“如果实现IDisposable,那么应该使finalizer调用Dispose(false)。“@Jim-不幸的是,那一页的措辞很糟糕。您真正需要做的就是确保资源由继承链中您的类型上方的某个终结器清理,而且几乎总是这样。在“实现Finalize and Dispose以清理非托管资源”中,它说,请注意,即使使用Dispose提供显式控制,也应使用Finalize方法提供隐式清理。Finalize提供了一个备份,以防止在程序员未能调用Dispose时资源永久泄漏。”在我看来,他们好像在说,“如果实现IDisposable,那么应该使finalizer调用Dispose(false)。“@Jim-不幸的是,那一页的措辞很糟糕。您真正需要做的就是确保资源被继承链中您的类型上方的某个终结器清理干净,而且它几乎总是已经清理干净了。