У меня есть реализация интерфейса, и этот интерфейс расширяет 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, чтобы всегда вызывать SupressFinalize в Dispose независимо?