【问题标题】:Resharper Code Pattern for IDisposable not inside usingIDisposable 的 Resharper 代码模式不在内部使用
【发布时间】:2012-03-29 16:30:05
【问题描述】:

我想知道如何构建 Resharper (6.1) 代码模式来搜索和替换以下问题:

var cmd = new SqlCommand();
cmd.ExecuteNonQuery();

把它变成这样:

using (var cmd = new SqlCommand())
{
  cmd.ExecuteNotQuery();
}

和:

 StreamReader reader = new StreamReader("myfile.txt");
 string line = reader.Read();
 Console.WriteLine(line);

变成:

using (StreamReader reader = new StreamReader("file.txt"))
{
   string line = reader.ReadLine();
   Console.WriteLine(line);
}

编辑: 感谢您的回答,但我正在寻找任何实现 IDisposable

【问题讨论】:

    标签: resharper static-analysis


    【解决方案1】:

    搜索模式:

    var $cmd$ = $sqlcommand$;
    $cmd$.ExecuteNonQuery();
    

    替换模式:

    using (var $cmd$ = $sqlcommand$)
    {
    $cmd$.ExecuteNonQuery();
    }
    

    其中cmd = 标识符

    sqlcommand = System.Data.SqlClient.SqlCommand 类型的表达式

    【讨论】:

    • 关闭但排除 SqlCommand 问题。我正在寻找在代码库中使用using 的机会。
    • 嗯.. 你原来的问题是完全是 SqlCommand-specific
    • 你是对的,但标题没有改变。我进行了编辑以澄清我的问题。我也对您的回复投了赞成票,但这不是我想要的答案。有没有办法使用代码模式来找到一个实现IDisposable 的对象,它没有被using 包裹?
    • 据我了解,代码模式还不够强大,无法做到这一点,特别是因为它们不会让您否定条件(找到实现 IDisposable 的代码,它是 not 内部使用)。在 ReSharper 工具集的范围内,这只能通过按照 Dmitri 的建议编写 ReSharper 插件来实现。
    【解决方案2】:

    看起来您真正追求的是一种检查机制,该机制开始寻找IDisposable 对象并确保它们被处置。如果是这种情况,我怀疑自定义模式是否是正确的方法 - 毕竟,如果您确实在几行之后调用Dispose() 会怎样?

    实现此目的的一种方法是使用ReSharper SDK。事实上,SDK 附带的示例之一是 PowerToy,它在特定类上实现了IDisposable,因此您可以将该代码作为可能的使用分析的基础。

    【讨论】:

    • 如果在其他行中抛出异常,则在几行之后调用 Dispose 将无济于事,除非您从 finally 块中调用它。
    【解决方案3】:

    使用 ReSharper | 下的搜索模式工具查找菜单。

    在搜索模式中,确保您已选择 C#,并在框中输入您要搜索的代码。点击右上角的替换按钮,在替换模式框中输入您要替换的代码。

    您可以保存搜索和替换模式,如果您愿意,R# 将使用它进行后续代码分析。您还可以在代码检查 | 下的 R# 选项中添加其他模式。自定义模式。

    【讨论】:

    • 不错的细节/方法,但我在这里寻找代码模式目录 sn-p
    • 您是说在代码检查中添加自定义模式吗?
    • 是的,自定义模式和任何实现 IDisposable
    猜你喜欢
    • 1970-01-01
    • 2011-03-07
    • 1970-01-01
    • 2023-04-08
    • 2012-02-08
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多