c# - 使困惑。 CA1063错了吗? GC.SuppressFinalize(这个)

标签 c# .net garbage-collection

我有一个简单的类 MyDataClass,其成员 (obj) 实现了 IDisposable:

public class MyDataClass : IDisposable
{
    private DisposableObject obj;
    private List<string> list;
    private int c;

    public MyDataClass()
    {
        obj = new DisposableObject();
        list = new List<string>();
        c = 114;
    }

    public void Dispose()
    {
        obj.Dispose();
    }
}

public class DisposableObject : IDisposable
{
    public void Dispose()
    {
        // Free resource
        Console.WriteLine("Dispose DisposableObject");
    }
}

当我运行代码分析时,我收到 CA1063 警告,它告诉我应该在 Dispose() 方法中调用 GC.SuppressFinalize() 方法>MyDataClass 实现。

而且我对这个 CA1063 警告真的很困惑。因为据我所知,我应该调用 GC.SuppressFinalize() 来向垃圾收集器指示:

“嘿 GC,不要担心这个对象,因为我已经为你完成了所有清理工作!”

所以请确认我是否错了。如果我将添加 GC.SuppressFinalize() 我将摆脱 CA1063 但它会导致 GC 不会清理我的对象。所以我会发生内存泄漏,因为其他类成员(托管代码)不会被清理。

最佳答案

GC.SuppressFinalize() 方法指示 VM 不要运行 finalizer。这是 C# 中看起来很有趣的方法:

~MyDataClass()

要删除警告,您需要密封您的类(class),或实现完整的 IDisposable pattern .

关于c# - 使困惑。 CA1063错了吗? GC.SuppressFinalize(这个),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11793119/

相关文章:

c# - 如何比较类型

c# - 使用共享源在位图上绘图

.net - 通用类 (T) - 从一系列类型 VB.Net 中指定

c# - 使用 AutoResetEvent 暂停/恢复线程

c# - SslStream.AuthenticateAsClient - 发送时无法立即完成非阻塞套接字操作

java - 有多少对象适合垃圾收集器?

JavaScript - 函数调用后的垃圾收集

c# - Linq Any() 与 foreach

java - "finalizer guardian"在 Java 中如何工作?

c# - 更改在 outlook html 电子邮件中呈现的电子邮件地址超链接的颜色