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

时间:2011-09-27 07:17:48

标签: c# idisposable

  

可能重复:
  Calling null on a class vs Dispose()

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

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

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接口实现它或没有以上?

3 个答案:

答案 0 :(得分:5)

这取决于,你是否有需要与你的对象一起摆脱的托管资源(文件句柄,套接字,连接等......)?如果是,那么你需要一个Dispose()如果你的类包含基本类型或只是你不需要处理的信息,设置为null将提示GC清除那个内存。

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

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

如果C#类中的一个方法调用一个调用fopen()的例程,并且该例程在将FILE *放在一个C#程序知道但没有其他事情发生的地方后返回,那么该方法负责查看必须以某种方式使用该FILE *调用fclose()。该文件需要为fclosed(),系统中没有任何其他信息或动力必须这样做,因此责任落在C#类上。

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

要实现的重要一点是,当垃圾收集器破坏对象时,系统将不关心任何对象字段中的内容。它甚至不会看它们。重要的是该对象是否有任何未履行的责任,以确保在不再需要其服务的情况下,确认甚至可能不在同一台机器上的外部实体