Resharper自定义搜索模式以警告IDisposable对象

3

由于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
这些模式的问题在于,除了使用语句内的局部变量声明之外,在您实际处理对象时它们并不会消失。它也无法跟踪对象所有权,例如工厂方法和传递方法。因此,我认为通过结构化模式来解决这个问题几乎是无用的。
无论如何,您可能需要两种模式来检查局部变量,比如:
var $identifier$ = $expression$; 
$type$ $identifier$ = $expression$;

where expression 和 type 都实现了 IDisposable 接口。


当然,我理解这一点,但我只想在一个可丢弃的对象首次声明时得到一个警告。谢谢你的建议,但它们似乎不起作用。如果我只使用$expression$,它可以工作,但会在每次使用对象时都发出警告,而我只想在声明时得到警告。 - Rita

0

虽然这并没有直接回答你的问题,但有各种运行时技术可以找到未处理的IDisposable这是其中一种技术


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接