我正在阅读"C#语言",第4版,它讨论垃圾收集如下:
"BILL WAGNER:以下规则是C#与其他托管环境之间的重要区别.
在应用程序终止之前,会调用析构函数的所有尚未被垃圾回收的对象,除非已经抑制了这种清理(例如,通过调用库方法GC.SuppressFinalize)."
所以我在这里有几个问题:
Q1.为什么.net与其他托管环境不同(我想这是暗示Java?)?任何特定的设计问题?
Q2.GC.SuppressFinalize调用的对象会发生什么?我明白这意味着GC不会调用这些对象的终结器(析构函数),如果是这样,这些对象什么时候才会被破坏,以便分配的内存位返回堆?否则会有内存泄漏?
我目前正在审查一个C#应用程序,我在其中看到:
public static bool ServiceExists(string servicename)
{
ServiceController[] services = ServiceController.GetServices();
foreach (ServiceController s in services)
{
if (s.ServiceName == servicename)
{
return true;
}
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
在这个答案中,Henk表示不使用Dispose()(或using)不会产生内存泄漏,无论是真是假?
我可以保留以前的代码吗或者我应该写一些像:
public static bool ServiceExists(string servicename)
{
ServiceController[] services = ServiceController.GetServices();
bool exists = false;
foreach (ServiceController s in services)
{
using(s)
{
if (s.ServiceName == servicename)
{
exists = true;
}
}
}
return exists;
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,不使用Dispose()(或using)有什么风险?