C# 应强制对所有对象使用dispose

C# 应强制对所有对象使用dispose,c#,dispose,C#,Dispose,我有一个函数,其中我为一个类创建了一个对象,在函数中使用它并将其返回给调用函数 Myobj read(string s) { Myobj obj = new Myobj (); .................. ........................ return obj } 在这种情况下,我应该强制处置我创建的对象 什么时候应该使用析构函数、dispose、finalize取决于具体情况 如果对象创建非托管资源,如位图、流等。。然后它应该实现IDis

我有一个函数,其中我为一个类创建了一个对象,在函数中使用它并将其返回给调用函数

Myobj read(string s)
{
   Myobj obj = new Myobj ();
   ..................
   ........................
    return obj
 }
在这种情况下,我应该强制处置我创建的对象

什么时候应该使用析构函数、dispose、finalize取决于具体情况

如果对象创建非托管资源,如位图、流等。。然后它应该实现
IDisposable
,并有一个终结器,以便清理这些资源

如果不是。。然后垃圾收集器将在它决定要收集时收集它

此网站、MSDN等上有许多问题/答案可以回答此问题。大多数的书在某个时候也谈到了这一点

下面是一些关于StackOverflow的问题,它们更详细地回答了您的问题:


您需要担心Dispose()/IDisposable的唯一原因是,如果您处理的是内存以外的资源。这包括数据库连接、套接字、GDI资源、文件流和其他一些东西。如果您只有一个POCO(普通的旧CLR对象),就不需要IDisposable


您需要担心终结器的唯一原因是,如果您已经在构建一个实现IDisposable的类型,并且还没有一个.Net类将终结此资源。上面提到的所有内容(数据库连接、套接字、GDI资源和文件流)都已经有一个.Net类来完成资源,因此您不需要终结器,除非您正在做类似于构建一种全新数据库的事情。

如果没有引用,您的答案中的最后一句话是无用的。抱歉,Robert。当我复制和粘贴类似的问题时,一位同事走了进来:如果您只使用已经有托管包装器的非托管资源,那么就不需要终结器。这包括“位图、流等”。所有这些都已经有了托管包装器,因此将被最终确定。@JoelCoehoorn我是否应该重新措辞,指出垃圾收集器将。。总有一天。。最后确定这些资源?我的观点是,你可以在包装完成后清理它们。。而不是等待垃圾收集器稍后完成它们。@SimonWhitehead这就是一次性的用途。当包装器完成时,您不需要清理它们,因为托管对象将在大约同一时间完成。在某些情况下,仅内存的资源被视为非托管资源,因此也应该被处置。我理解你的意思,但这是一个艰难的边缘…不幸的是,微软未能澄清什么是“非托管资源”;定义的特征不是它是一个由底层操作系统控制的实体,而是它代表一些外部实体(通常,但不一定是操作系统)代表一个对象正在做并将继续做的事情,对其他实体不利,直到发出停止通知为止。例如,操作系统可能会授予对象对文件的独占访问权,从而阻止任何其他实体使用它。虽然最广泛认可的非托管资源类型代表托管代码世界之外的事物,但一些非托管资源可能完全存在于托管代码世界中。例如,观察者对象可能会在每次可观察对象更改时请求通知。这样的事件订阅可以完全在托管代码中处理,但仍然表示非托管资源,因为可观察对象至少会代表观察者保留一些分配的内存,直到被告知不这样做。记住:这取决于具体情况。一种情况是为什么要这样做:如果
MyObj
类是托管的,那么GC将负责处理,但是如果它涉及非托管资源,那么您应该注意正确地处理非托管资源,因此您应该编写一个dispose函数。顺便说一句,
MyObj
是给定给类的wierd名称。