Можно ли установить Resharper для предупреждения, если IDisposable не обрабатывается правильно? - PullRequest
33 голосов
/ 19 сентября 2008

Есть ли в Resharper 4 параметр (или даже сама Visual Studio ...), который выдает предупреждение, если я забуду обернуть код в блок using или пропустить соответствующий вызов Dispose в блоке finally?

Ответы [ 5 ]

28 голосов
/ 19 сентября 2008

Правильный автоматический анализ утилизации требует DFA (Data Flow Analysis) в глобальном масштабе. Маловероятно, что вы создаете объект IDisposable, не вызываете на нем какой-либо метод и не передаете его в качестве аргумента. Если одноразовый объект передается другим методам (включая вызов его членов, когда неявно передается «this»), инструмент должен проанализировать, не вызван ли Dispose внутри, или этот объект не сохранен где-либо для последующего удаления.

Тем не менее, наивная реализация проверки того, действительно ли одноразовый объект утилизируется с помощью конструкции "using" или каким-либо иным способом, выдает слишком много ложных срабатываний и делает анализ бесполезным.

6 голосов
/ 22 мая 2011

Недовольство текущими методами я создал самостоятельно: EyeDisposable . Это инструктор IL, поэтому он должен отлавливать множество утечек, которые не обнаруживаются статическим анализом. Это все еще на ранней стадии, приемы приветствуются.

2 голосов
/ 22 сентября 2009

Вы можете посмотреть на FXCop для этого: http://msdn.microsoft.com/en-us/library/ms182328(VS.80).aspx

Жаль, что R # не справляется с этим, даже если просто предупреждение для полей в вашем классе и / или переменных, которые вы создаете.

2 голосов
/ 19 сентября 2008

См. в этом блоге , где описаны некоторые приемы тестирования для Dispose() в DEBUG. По сути, напишите деструктор только для DEBUG, который утверждает, что вы были уничтожены.

2 голосов
/ 19 сентября 2008

Вы можете создать небольшую надстройку для R #, которую вы могли бы запустить в редакторе кода, который сканирует код и обновляет анализ кода, чтобы отразить, что вы объект, которому не хватает только что описанной структуры.

Я бы посмотрел на архитектуру плагина R #, если вы решите пойти по этому пути.

...