首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >迷惑了。CA1063错了吗?GC.SuppressFinalize(这个)

迷惑了。CA1063错了吗?GC.SuppressFinalize(这个)
EN

Stack Overflow用户
提问于 2012-08-03 09:37:32
回答 2查看 2.5K关注 0票数 7

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

代码语言:javascript
复制
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警告,这表明我应该在MyDataClass实现中的Dispose()方法中调用方法。

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

“嘿,GC,不要担心这个东西,因为我已经为你做了所有的清洁工作了!”

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-03 09:41:35

如果我要添加GC.SuppressFinalize(),我将去掉CA1063,但是它会导致GC不会清理我的对象。

不,你的物品还会被收集起来。

“嘿,GC,不要担心这个东西,因为我已经为你做了所有的清洁工作了!”

您实际上只是说:不要担心这个对象的终结器(析构函数)。如果它有一个。

这就是代码分析错误的地方:您的类确实有一个IDisposable.Dispose()方法,但是它没有析构函数。因此,这一警告是毫无意义的,过度保护,并以错误的理由触发。禁用或忽略它。

票数 3
EN

Stack Overflow用户

发布于 2012-08-03 09:48:25

方法GC.SuppressFinalize()指示VM不要运行终结器。在C#中,这是一个有趣的方法:

~MyDataClass()

要删除警告,您需要密封类,或者实现完整的IDisposable模式

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11793119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档