我上了这个课:
public abstract class ImplementsIDisposable : IDisposable
{
public abstract void Dispose();
private class InnerClass : ImplementsIDisposable
{
private bool disposedValue;
public override void Dispose()
{
if (!disposedValue)
{
doSomething();
disposedValue = true;
}
GC.SuppressFinalize(this);
}
}
}
代码分析将抛出此消息:
CA1063修改Dispose()使其调用Dispose(true),然后调用 对当前对象实例进行GC.SuppressFinalize,然后返回。
还有一个:
CA1063确保将Dispose()声明为公共且已密封。
此行均是
public abstract void Dispose();
是否可以将Dispose()
而不是ImplementsIDisposable
中的InnerClass
实施?
答案 0 :(得分:1)
没有任何理由public Dispose()
应该是虚拟的,而不是抽象的。
您需要检出处置模式并正确实施它。警告提示您应该怎么做,但是除非您知道模式的开始,否则它们可能是相当隐秘的。
您可以了解处置模式 here,这很简单。
当然,不要错过this canonical SO answer。
答案 1 :(得分:1)
我试图遵循公认的答案,但是由于我方法的最后两行确实是Dispose(true)和GC.SupressFinalize(this),所以我一直碰壁。事实证明,警告并没有使我理解,这些应该是方法中的 ONLY 行,仅保留以下内容。我相信接受的答案中的第一个链接确实可以解释这种差异,但我并未像应该那样仔细地阅读它。
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
try
{
if (disposing)
{
// call Dispose on all your disposable fields/properties
}
}
finally
{
// free all unmanaged resources here. Note that this is not in an else block.
}
}
感谢https://netvignettes.wordpress.com/2011/06/29/how-to-implement-dispose-properly/使我步入正轨。