Я пытаюсь придерживаться правил анализа кода VS2005 для нового проекта. У меня есть такой способ:
public void Dispose()
{
Console.WriteLine("Dispose() called");
Dispose( true );
GC.SuppressFinalize(this);
}
(Консольный вызов в какой-то момент превратится в вызов log4net, и мы всегда заинтересованы в регистрации удаления для некоторых из наших типов).
Присутствие строки отладки консоли вызывает эту ошибку:
Ошибка 1 CA1063: Microsoft.Design: Modify PerfectDisposableClass.Dispose (): Void, чтобы он вызывал Dispose (true), затем вызывает GC.SuppressFinalize для текущего экземпляра объекта ('this' или 'Me' в VB), а затем возвращает . F: \ Visual Studio 2005 \ Projects \ DisposeAndFinalize \ DisposeAndFinalize \ PerfectDisposableClass.cs 26 DisposeAndFinalize
Есть ли способ обойти это, не прибегая к директивам прагмы? Возможно, напишу свои правила? Кроме того, можно ли где-нибудь взглянуть на существующие правила сборки с помощью отражателя?





Вы можете поместить оператор журнала в метод Dispose (bool Disposing), чтобы не выходить за рамки рекомендаций:
public void Dispose(bool disposing)
{
if (disposing)
{
Console.WriteLine("...");
}
...
}
Вы хоть представляете, когда метод Dispose (bool) является защищенным виртуальным? В этом случае я бы хотел, чтобы Console.WriteLine вызывался перед каждым удалением, тогда нам все равно понадобится код, который будет таким, как в исходном сообщении, и он все равно сломает CA1063.
Простые ответы всегда лучше! У меня были вызовы журнала в моих Dispose (), Dispose (bool) и finalizer. Нет необходимости в вызовах журнала в Dispose () или финализаторе, я могу просто добавить их в Dispose (bool), как вы предложили, спасибо.