Можно ли настроить Resharper на предупреждение, если IDisposable обрабатывается неправильно?

StackOverflow https://stackoverflow.com/questions/101664

Вопрос

Есть ли в 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# не справляется с этим, даже если это просто предупреждение для полей в вашем классе и/или создаваемых вами переменных.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top