我有一个简单的类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警告,这表明我应该在MyDataClass实现中的Dispose()方法中调用方法。
对于这个CA1063警告,我真的很困惑。因为据我所知,我应该调用GC.SuppressFinalize()向垃圾收集器指示:
“嘿,GC,不要担心这个东西,因为我已经为你做了所有的清洁工作了!”
所以请确认我是否错了。如果我要添加GC.SuppressFinalize(),我将去掉CA1063,但是它会导致GC不会清理我的对象。因此,我将出现内存泄漏,因为其他类成员(托管代码)将不会被清除。
发布于 2012-08-03 09:41:35
如果我要添加
GC.SuppressFinalize(),我将去掉CA1063,但是它会导致GC不会清理我的对象。
不,你的物品还会被收集起来。
“嘿,GC,不要担心这个东西,因为我已经为你做了所有的清洁工作了!”
您实际上只是说:不要担心这个对象的终结器(析构函数)。如果它有一个。
这就是代码分析错误的地方:您的类确实有一个IDisposable.Dispose()方法,但是它没有析构函数。因此,这一警告是毫无意义的,过度保护,并以错误的理由触发。禁用或忽略它。
发布于 2012-08-03 09:48:25
方法GC.SuppressFinalize()指示VM不要运行终结器。在C#中,这是一个有趣的方法:
~MyDataClass()
要删除警告,您需要密封类,或者实现完整的IDisposable模式。
https://stackoverflow.com/questions/11793119
复制相似问题