C# Disposing自定义类:设置NULL与Dispose

C# Disposing自定义类:设置NULL与Dispose,c#,idisposable,C#,Idisposable,可能重复: 只是想要一些关于处理对象的信息 我已经创建了一个Employee类,它是从IDisPossible接口继承的。下面是示例代码 public class Employee : IDisposable { private Int32 _RunID; public Int32 RunID { get { return _RunID; } set { _RunID = value; } } public void Dispose()

可能重复:

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

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

public class Employee : IDisposable 
 {
      private Int32 _RunID;

      public Int32 RunID { get { return _RunID; } set { _RunID = value; } }

        public void Dispose()
        {
            //Dispose(true);
        }
 }

现在我的问题是,处理我们创建的每个类并使用IDisPossible接口实现/继承它是一种很好的编码实践,即使我见过许多其他人直接将ObjEmployee=null设置为代码;所以,我只是混淆了设置NULL或使用IDisPossible接口实现它是好的,还是以上任何一项都不好?

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

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

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

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

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

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

如果C#类中的一个方法调用了一个调用fopen()的例程,并且该例程在将文件*放在C#程序知道但其他什么都不知道的位置后返回,则该方法负责查看必须以某种方式使用该文件*调用fclose()。该文件需要fclosed(),并且系统中没有任何其他内容具有执行此操作所需的信息或动力,因此责任落在该C#类身上

如果C#方法返回而不将文件*存储在任何地方,那么该文件将永远不会被关闭,除非或直到应用程序退出,否则世界上任何地方的其他人都无法使用它。如果C#方法必须退出而不产生文件的独占使用,那么它必须以一种能够确保在不再需要独占使用后,某个地方的某个人会将其清理干净的方式来存储文件*。通常的模式是将文件*存储在类字段中的方法,以及包含该方法的类,通过复制并清空该字段来实现IDisposable,查看该字段是否为非空,如果为非空,则调用fclose()存储的文件*


要认识到的重要一点是,当一个对象被垃圾收集器破坏时,系统将不关心任何对象字段中的内容。它甚至连看都不看。重要的是对象是否有任何未履行的责任来确保外部实体(甚至可能不在同一台机器上)在不再需要其服务时得到通知。

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

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

如果C#类中的一个方法调用了一个调用fopen()的例程,并且该例程在将文件*放在C#程序知道但其他什么都不知道的位置后返回,则该方法负责查看必须以某种方式使用该文件*调用fclose()。该文件需要fclosed(),并且系统中没有任何其他内容具有执行此操作所需的信息或动力,因此责任落在该C#类身上

如果C#方法返回而不将文件*存储在任何地方,那么该文件将永远不会被关闭,除非或直到应用程序退出,否则世界上任何地方的其他人都无法使用它。如果C#方法必须以O退出