CA1063 修改 Dispose() 以便它调用 Dispose(true),然后在当前对象实例上调用 GC.SuppressFinalize,然后调用 returns
CA1063 Modify Dispose() so that it calls Dispose(true), then calls GC.SuppressFinalize on the current object instance and then returns
我有这个class:
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 Modify Dispose() so that it calls Dispose(true), then calls
GC.SuppressFinalize on the current object instance and then returns.
还有这个:
CA1063 Ensure that Dispose() is declared as public and sealed.
都在这一行:
public abstract void Dispose();
难不成是想让Dispose()
实现在ImplementsIDisposable
而不是InnerClass
?
没有理由 public Dispose()
应该是虚拟的而不是抽象的。
您需要检查 dispose 模式 并正确实施它。这些警告提示您应该如何操作,但除非您知道该模式是如何开始的,否则它们可能会相当含糊。
你可以阅读 Dispose 模式 here,它很简单。
当然,不要错过 this canonical SO answer 这个主题。
我试图遵循已接受的答案,但我将 运行 挡在了墙上,因为我的方法的最后两行确实是 Dispose(true) 和 GC.SupressFinalize(this)。结果警告并没有让我明白这些应该是方法中的 ONLY 行,留下了类似下面的内容。我相信接受的答案中的第一个 link 实际上确实解释了这种差异,但我没有像我应该的那样仔细阅读它。
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/ 让我走上正轨。
我有这个class:
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 Modify Dispose() so that it calls Dispose(true), then calls GC.SuppressFinalize on the current object instance and then returns.
还有这个:
CA1063 Ensure that Dispose() is declared as public and sealed.
都在这一行:
public abstract void Dispose();
难不成是想让Dispose()
实现在ImplementsIDisposable
而不是InnerClass
?
没有理由 public Dispose()
应该是虚拟的而不是抽象的。
您需要检查 dispose 模式 并正确实施它。这些警告提示您应该如何操作,但除非您知道该模式是如何开始的,否则它们可能会相当含糊。
你可以阅读 Dispose 模式 here,它很简单。
当然,不要错过 this canonical SO answer 这个主题。
我试图遵循已接受的答案,但我将 运行 挡在了墙上,因为我的方法的最后两行确实是 Dispose(true) 和 GC.SupressFinalize(this)。结果警告并没有让我明白这些应该是方法中的 ONLY 行,留下了类似下面的内容。我相信接受的答案中的第一个 link 实际上确实解释了这种差异,但我没有像我应该的那样仔细阅读它。
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/ 让我走上正轨。