CA2202 CA2215 HttpApplication Утилизировать базовый вызов
В настоящее время я получаю CA2202 (не размещать объекты несколько раз) для кода, который я анализирую. Предупреждение относится к HttpApplication.Dispose
метод, который я переопределяю. Я знаю IDispose.Dipose
метод не должен быть виртуальным или переопределенным, но это результат реализации Microsoft IDispose.Dispose
как виртуальный в HttpApplication
класс и не предоставляя виртуальный защищенный метод Dispose.
Предупреждение, по-видимому, жалуется на вызов base.Dispose
метод. Я вызываю базовый метод Dispose в случае, если базовый класс должен закрыть или удалить какие-либо объекты. И также подозреваю, что я, вероятно, в конечном итоге с CA2215 (методы Dispose должны вызывать dispose базового класса) в противном случае.
Кто-нибудь знает, почему я получаю это (CA2202) предупреждение и что с этим делать?
Я испытываю желание подавить это, но документы MSDN говорят, что это никогда не должно подавляться.
Подкласс выглядит следующим образом (он был сокращен для краткости, и вы можете предположить, что _container
поле было инициализировано):
public class MyHttpApplication : HttpApplication
{
private bool _disposed;
private IDisposable _container;
public sealed override void Dispose()
{
if (_disposed)
return;
try
{
Dispose(true);
GC.SuppressFinalize(this);
}
finally
{
//The following lines is what causes the CA2202 code analysis warning
base.Dispose();
}
}
protected virtual void Dispose(bool disposing)
{
if (_disposed)
return;
try
{
if (disposing && _container != null)
{
_container.Dispose();
}
}
finally
{
_disposed = true;
}
}
}
1 ответ
Кажется, нет выхода без подавления чего-либо. Мое решение состояло в том, чтобы поместить вызов base.Dispose() в метод Dispose(bool), а затем подавить CA2215, для чего документы MSDN говорят: "Безопасно подавить предупреждение из этого правила, если вызов base.ispose происходит в более глубокий уровень вызова, чем проверка правил ".
[SuppressMessage("Microsoft.Usage", "CA2215:Dispose methods should call base class dispose", Justification = "base.Dispose() is called from Dispose(bool)")]
public sealed override void Dispose()
{
if (_disposed)
return;
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (_disposed)
return;
try
{
if (disposing)
{
base.Dispose();
if (_container != null)
{
_container.Dispose();
}
}
}
finally
{
_disposed = true;
}
}