Можно ли настроить Resharper на предупреждение, если IDisposable обрабатывается неправильно?
-
01-07-2019 - |
Вопрос
Есть ли в Resharper 4 (или даже в самой Visual Studio...) настройка, которая вызывает предупреждение, если я забуду обернуть код в using
заблокировать или пропустить правильный вызов Dispose в finally
блокировать?
Решение
Для правильного автоматического анализа Dispose требуется DFA (анализ потока данных) в глобальном масштабе.Маловероятно, что вы создаете объект IDisposable, не вызываете для него какой-либо метод и не передаете его в качестве аргумента.Если одноразовый объект передается другим методам (включая вызов его членов, когда «this» передается неявно), инструмент должен проанализировать, не вызывается ли Dispose внутри или этот объект не сохраняется где-то для последующего удаления.
Тем не менее, наивная реализация проверки того, действительно ли одноразовый объект расположен с помощью конструкции «using» или каким-либо другим способом, приведет к слишком большому количеству ложных срабатываний и сделает анализ бесполезным.
Другие советы
Недовольный нынешними методами, я создал свои: ГлазОдноразовый.Это инструментарий IL, поэтому он должен обнаруживать множество утечек, не обнаруженных статическим анализом.Это все еще на ранней стадии, отзывы приветствуются.
Вы можете разработать небольшую надстройку к R#, которую можно было бы запустить внутри редактора кода, который сканирует код и обновляет анализ кода, чтобы отразить, что вы — объект, у которого отсутствует структура, которую вы только что описали.
Я бы изучил архитектуру плагинов R#, если вы решите пойти по этому пути.
Видеть этот пост в блоге некоторые трюки для тестирования Dispose()
в DEBUG
.По сути, напишите деструктор только для отладки, который утверждает, что вы были удалены.
Возможно, вы захотите посмотреть FXCop для этого: http://msdn.microsoft.com/en-us/library/ms182328(VS.80).aspx
Жаль, что R# не справляется с этим, даже если это просто предупреждение для полей в вашем классе и/или создаваемых вами переменных.