正在处理自定义类:设置NULL VS.Dispose

本文关键字:设置 NULL VS Dispose 处理 自定义 | 更新日期: 2023-09-27 18:09:39

可能重复:
在类上调用null vs Dispose((

只是想要一些关于处理对象的信息。

我已经创建了一个Employee类,它是从IDISPOSIBLE接口继承的。以下是示例代码

public class Employee : IDisposable 
 {
      private Int32 _RunID;
      public Int32 RunID { get { return _RunID; } set { _RunID = value; } }
        public void Dispose()
        {
            //Dispose(true);
        }
 }

现在我的问题是,用IDisposible接口处理我们创建和实现/继承的每个类是一个很好的编码实践,即使我见过很多其他人直接设置ObjEmployee=null进行编码;所以我很困惑,设置NULL和用IDisposible接口实现它哪个好?

正在处理自定义类:设置NULL VS.Dispose

这取决于您是否有需要随对象一起处理的托管资源(文件句柄、套接字、连接等(?如果是,那么如果您的类包含基本类型或仅包含不需要处理的信息,则需要Dispose((,并且设置为null将提示GC清除该内存。

当您设置ObjEmployee=null时,您只标记对象实例为垃圾回收器做好准备,但您对实际清理的时间没有影响,可能需要一段时间。当您使用Dispose((方法时,GC会立即运行并释放对象正在使用的内存。

在决定一个类是否应该实现IDisposable时,最根本的问题是该类的实例是否承担了确保其他实体得到清理的责任;通常,那些其他实体将代表IDisposable对象改变其行为,并以牺牲其他实体为代价,而IDisposaable对象负责让他们知道何时不再需要这样做

例如,如果任何代码在任何地方使用C函数fopen((打开位于服务器上的文件进行读写访问,则服务器将通过禁止其他人访问该文件来改变其行为,直到它收到打开它的程序不再需要它的消息。当程序不再需要独占使用该文件时,它可以调用fclose((,从而通知服务器该文件应该可以再次用于其他应用程序。

如果C#类中的一个方法调用了一个调用fopen((的例程,并且该例程在将FILE*放在C#程序知道但其他什么都不做的位置后返回,那么该方法将负责确保fclose((必须以某种方式用该FILE*调用。该文件需要fclosed((,而系统中的其他任何东西都没有这样做所需的信息或动力,因此责任落在了C#类身上。

如果C#方法返回时不将FILE*存储在任何位置,那么该文件将永远不会被关闭,并且除非或直到应用程序退出,否则宇宙中任何地方的其他人都无法使用它。如果C#方法必须在不产生文件独占使用的情况下退出,则它必须以确保某个地方的某个人在不再需要独占使用后将其清除的方式存储file*。通常的模式是,该方法将FILE*存储在类字段中,而包含该方法的类则通过复制和清空该字段来实现IDisposable,查看它是否为非空,如果为非空则调用fclose((存储的FILE*。

需要实现的重要一点是,当对象被垃圾收集器销毁时,系统不会关心任何对象字段中的内容。它甚至不会看他们。重要的是,对象是否有任何未履行的责任,以确保外部实体在不再需要其服务时得到通知,这些实体甚至可能不在同一台机器上。