У меня есть реализация интерфейса, и этот интерфейс расширяет 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."
}
Итак, похоже, я могу решить эту проблему одним из двух способов:
Сделать класс запечатанным
:
public sealed MyStuffImpl : IMyStuff
{
public void Dispose()
{
}
}
Реализовать часть типичного шаблона:
public MyStuffImpl : IMyStuff
{
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool disposing)
{
}
}
В моем случае я не планирую когда-либо расширять эту реализацию, поэтому я, вероятно, решу его, сделав его запечатанным
, но я признаю, что действительно не понимаю почему важно, запломбирован он или нет.
Кроме того, только потому, что мой класс запечатан, FxCop больше не сообщает мне, что Dispose ()
должен вызывать GC.SupressFinalize (this);
, но так ли это на самом деле? «Лучше» ли в .NET всегда вызывать SupressFinalize в Dispose независимо?