C# 如何在C中释放对象#

C# 如何在C中释放对象#,c#,oop,memory-management,object,C#,Oop,Memory Management,Object,谁能告诉我如何在C#中释放对象? 例如,我有一个对象: Object obj1 = new Object(); //Some code using obj1 /* Here I would like to free obj1, after it is no longer required and also more importantly its scope is the full run time of the program. */ 谢谢你的帮助你不必这么做。您只需停止引用它们,垃圾

谁能告诉我如何在C#中释放对象? 例如,我有一个对象:

Object obj1 = new Object();
//Some code using obj1
/*
Here I would like to free obj1, 
after it is no longer required 
and also more importantly 
its scope is the full run time of the program.
*/

谢谢你的帮助

你不必这么做。您只需停止引用它们,垃圾收集器就会(在某个时候)为您释放它们


您应该在使用非托管资源的类型上实现,并将任何实现了
IDisposable
的实例包装在一个语句中。

您停止引用它们,让垃圾收集器接收它们

如果要释放对象,请添加以下行:

obj1=null


如果可以删除该对象,则垃圾收集器将停止运行(前提是没有其他指向该对象的指针使其保持活动状态)。

您不必这样做。运行时的垃圾收集器将出现并为您清理垃圾。这就是为什么你首先使用C语言而不是非托管C++的原因:)

你可以使用<强> <强>语句。在作用域之后,对对象的引用将被删除,垃圾收集器可以在以后收集它。

您不需要。这是垃圾收集器自动执行的操作-基本上是当.NET运行时需要内存时,它会四处移动并删除不再使用的对象

要使其工作,您必须删除对象的所有LINNK

就你而言

obj1=null

最后,对象不再被引用,可以从垃圾收集器中声明

您可以查看更多详细信息


请注意,如果对象具有对非托管资源(如打开的文件等)的引用,则应实现一次性模式(IDisposable接口),并且当不再需要该对象时,应明确释放这些引用。

不建议这样做,但如果确实需要,可通过以下方式强制垃圾收集:

GC.Collect();

正如其他人提到的,你不需要明确地释放他们;然而,有一点没有提到,虽然内置垃圾收集器确实会为您释放它们,但无法保证垃圾收集器何时会释放它们

您所知道的是,当它超出范围时,它可以由GC清理,并且在某个阶段会清理。

正如Chris指出的,C#为您执行大部分垃圾收集。您需要考虑垃圾收集的实例是使用<代码> IDISPOLID/<代码>接口,以及在使用<代码> WeakReference < /代码>时。
有关更多信息,请参阅和。

GC将收集除非托管资源外的所有资源


非托管资源应实现
IDisposable
。如果您使用的对象实现了
IDisposable
,那么您应该在不再需要该对象时调用该对象的
Dispose()
方法,或者使用
语句将其实例包装在
中。

这只适用于实现IDisposablet的对象,无需执行obj1=null;我本打算建议将其赋值为null,但有一点阅读说明这实际上会延迟C#中的垃圾收集。真有趣。有关为什么不应该在C#中赋值为null的更多信息,请参阅本文:其中的一个问题是当您调用另一个进程中的COM对象时。另一个进程将获得经典的“COM服务器警告”对话框,因为C#允许引用停留。我很确定在处理这个问题时,将引用设置为null会产生影响。不建议调用GC.Collect。请参阅建议某人调用GC.Collect()在我看来是错误的建议。或者只使用C++/CLI,这样您就不必记住哪些类型实现IDisposable,哪些不实现,当对象超出范围(如果不声明为句柄)时,它将自动调用Dispose这并不是使用C++/CLI的一个令人信服的理由:)@Ben Voigt如果您正确地实现了IDisposable,那么当Dispose函数超出C#中的范围时,它也会被调用。@Thanos:胡说八道。一个小的代码示例将演示:C#void fn(void){filestreams=newfilestream(“in.dat”);}s.Dispose不被调用。C++空虚空(空){FielestRAMS(“in .dAT”);}s sDebug被调用。请注意,“放置一个使用块”并不完全等价,C++语法对于IDISPISPONED和IDIISION对象是相同的,其中C ^不允许使用非IDISPOLYPE类型,如果某个类型开始在更高版本中实现IDisposable,则会导致巨大的维护。@Ben Voig:首先检查:当您将using命令转换为尝试{x=new x()}最后{x.Dispose()}时,在另一种情况下,当它超出范围时,析构函数调用私有Dispose(bool disposing)。在任何情况下,Microsoft的正确实现都是我提供的链接中可以看到的。除非引用是静态的,否则不要为引用设置空值。引用最终将超出范围,这将使实例有资格进行垃圾收集。只有当不再有对对象的引用(或链接)时,GC才会清理它,还是当GC检测到在某个点之后该对象根本不被代码使用时,它还会释放该对象(即使它的范围是比如说整个人方法,因为它的生命周期将是程序的完整运行时间)?@assasin:它在没有引用时收集,句号。GC不做编译器的工作。因此,如果有引用,它就不能收集,即使它将来不会被使用。这就是为什么我们必须小心静态对象。但在主方法示例中,这要视情况而定。堆栈中的引用具有主作用域。但它们指向的对象可能具有主作用域或者可能不取决于您的推荐人是否被重新分配。