相关疑难解决方法(0)

C#语言:垃圾收集,SuppressFinalize

我正在阅读"C#语言",第4版,它讨论垃圾收集如下:

"BILL WAGNER:以下规则是C#与其他托管环境之间的重要区别.

在应用程序终止之前,会调用析构函数的所有尚未被垃圾回收的对象,除非已经抑制了这种清理(例如,通过调用库方法GC.SuppressFinalize)."

所以我在这里有几个问题:

  • Q1.为什么.net与其他托管环境不同(我想这是暗示Java?)?任何特定的设计问题?

  • Q2.GC.SuppressFinalize调用的对象会发生什么?我明白这意味着GC不会调用这些对象的终结器(析构函数),如果是这样,这些对象什么时候才会被破坏,以便分配的内存位返回堆?否则会有内存泄漏?

.net c# garbage-collection suppressfinalize

16
推荐指数
2
解决办法
3137
查看次数

IDisposable:内存泄漏

我目前正在审查一个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)有什么风险?

c# memory-leaks idisposable

4
推荐指数
1
解决办法
969
查看次数