Изменить резкость настраиваемого шаблона поиска, чтобы предупредить идентифицируемые объекты - PullRequest
2 голосов
/ 23 июня 2010

Поскольку resharper по-прежнему не выдает никаких предупреждений относительно объектов, реализующих IDisposable, я хотел бы создать несколько пользовательских шаблонов поиска, доступных в resharper 5.0.

Пока у меня есть это:

(И не берите в голову мои заменяющие комментарии в шаблонах, мне это безразлично, я просто хочу иметь четкое предупреждение в коде при работе с одноразовыми объектами.)

- <CustomPatterns>
- <Pattern Severity="WARNING">
  <Comment>This class implements IDisposable interface.</Comment> 
  <ReplaceComment>Please use Using statement, or dispose the object manually when done using.</ReplaceComment> 
  <SearchPattern>$type$</SearchPattern> 
  <Params /> 
- <Placeholders>
  <IdentifierPlaceholder Name="var" Type="" ExactType="False" RegEx="" CaseSensitive="True" /> 
  <TypePlaceholder Name="type" Type="System.IDisposable" ExactType="False" /> 
  <ArgumentPlaceholder Name="args" Minimal="-1" Maximal="-1" /> 
  </Placeholders>
  </Pattern>
- <Pattern Severity="WARNING">
  <Comment>This class implements IDisposable interface.</Comment> 
  <ReplaceComment>Please use Using statement, or dispose the object manually when done using.</ReplaceComment> 
  <SearchPattern>new $type$($args$)</SearchPattern> 
  <Params /> 
- <Placeholders>
  <IdentifierPlaceholder Name="var" Type="" ExactType="False" RegEx="" CaseSensitive="True" /> 
  <TypePlaceholder Name="type" Type="System.IDisposable" ExactType="False" /> 
  <ArgumentPlaceholder Name="args" Minimal="-1" Maximal="-1" /> 
  </Placeholders>
  </Pattern>
  </CustomPatterns>

Это обрабатывает случаи объявления переменных, например

Bitmap myBitmap = GetBitmap();
private Bitmap _bitmap;

и вызовы CTOR, например

var myBitmap = new Bitmap(...);

Что он не поддерживает, так это:

var myBitmap = GetBitmap();

Я не могу найти ни одного примера того, как определить шаблон поиска, который либо найдет использование 'var', либо тип возврата метода, который является typeof IDisposable.

Я уверен, что есть способ, но я не могу его найти.

Ответы [ 2 ]

2 голосов
/ 23 июня 2010

Проблема с этими шаблонами заключается в том, что они не исчезают, когда вы фактически избавляетесь от объекта, за исключением случаев, когда объявления локальных переменных внутри операторов using. Он также не отслеживает владение объектом, например, для заводских методов и сквозных методов. Поэтому я считаю, что делать это с помощью структурированных шаблонов практически бесполезно.

В любом случае, вам могут понадобиться два шаблона для проверки локальных переменных, например

var $identifier$ = $expression$; 
$type$ $identifier$ = $expression$;

где выражение и тип реализуют IDisposable.

0 голосов
/ 23 июня 2010

Хотя это не дает прямого ответа на ваш вопрос, существуют различные методы выполнения, чтобы найти нераспределенные IDisposable с. Вот одна из таких техник .

...