你怎么样;适当地“;当你的实现是一个空方法时,实现Dispose()(根据FxCop)?(约1063年)
本文关键字:实现 方法 Dispose 1063年 FxCop 根据 一个 怎么样 当你 | 更新日期: 2023-09-27 18:21:00
我有一个接口的实现,该接口扩展了IDisposable
。在接口的特定实现中,我不需要处理任何东西,所以我只需要一个空的Dispose()
方法。
public interface IMyStuff : IDisposable
{
}
public MyStuffImpl : IMyStuff
{
public void Dispose()
{
}
}
现在在FxCop中,这导致CA1063:
Error, Certainty 95, for ImplementIDisposableCorrectly
{
Resolution : "Provide an overridable implementation of Dispose(
bool) on 'MyStuffImpl' or mark the type as sealed.
A call to Dispose(false) should only clean up native
resources. A call to Dispose(true) should clean up
both managed and native resources."
}
CriticalWarning, Certainty 75, for CallGCSuppressFinalizeCorrectly
{
Resolution : "Change 'MyStuffImpl.Dispose()' to call 'GC.SuppressFinalize(
object)'. This will prevent derived types that introduce
a finalizer from needing to re-implement 'IDisposable'
to call it."
}
Error, Certainty 95, for ImplementIDisposableCorrectly
{
Resolution : "Modify 'MyStuffImpl.Dispose()' so that it
calls Dispose(true), then calls GC.SuppressFinalize
on the current object instance ('this' or 'Me' in Visual
Basic), and then returns."
}
所以,看起来我可以用两种方法之一解决这个问题:
使类sealed
:
public sealed MyStuffImpl : IMyStuff
{
public void Dispose()
{
}
}
实现典型模式的一部分:
public MyStuffImpl : IMyStuff
{
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool disposing)
{
}
}
在我的情况下,我不打算扩展这个实现,所以我可能会通过将其设为sealed
来解决它,但我承认我真的不明白为什么它是密封的还是不密封的很重要。
而且,仅仅因为我的类是密封的,FxCop不再告诉我Dispose()
应该调用GC.SupressFinalize(this);
,但这真的是真的吗?不管怎样,在.NET中总是在Dispose中调用SupressFinalize是否"更好"?
SuppressFinalize()
没有意义,除非您的实例具有终结器
如果您的类没有终结器,但不是sealed
,那么您仍然应该是SuppressFinalize
,以防继承的类添加终结器。
除了Dispose(bool)
需要是protected virtual
之外,您的两个选项都是正确的。
在"实现典型模式的一部分"选项中,您应该将Dispose(bool)
方法设置为protected virtual
:
protected virtual void Dispose(bool disposing)
{
}
这将为子类提供一个处理其管理的任何资源的处置的机会。这就是"提供Dispose(bool)的可重写实现"中"可重写"的含义
当然,public virtual
也将满足FxCop。