字典中 TryGetValue 的 Resharper 重构模式

Resharper Refactor pattern for TryGetValue in Dictionary

我需要不断编写的最繁琐的语法是懒惰地初始化字典中的容器,例如:

ContainerRecord value;
if(!_dictionary.TryGetValue(key,out value))
{
   value = new ContainerRecord();
   _dictionary[key] = value;
}
//Container is always initialized here

我认为这是一个微不足道的重构模式: (至少对于显式变量声明和if语句部分)

var value = _dictionary[key];

我知道较新版本的 C# 中有一些新的语法糖,可以消除预先声明变量的需要。不幸的是,我无法在我的环境中访问这些功能,并且在可预见的未来也不会。

似乎确实有一个 "check for contains key" 重构,它实现了几乎相同的结果,但缺点是执行了两次查找。

这可以通过一些扩展实现吗?我认为这是一个足够常见的案例,它已经在某个地方得到解决了。

您可以为此创建自定义模式。

  1. 打开 ReSharper |选项....
  2. 转到代码检查 |自定义模式 节点。
  3. 单击添加图案 按钮。
  4. Select替换对话框右上角
  5. 使用 添加占位符 按钮添加以下四个占位符:

    Type: Identifier Placeholder
    Name: value
    
    Type: Expression Placeholder
    Name: key
    
    Type: Type Placeholder
    Name: type
    
    Type: Expression Placeholder
    Name: dict
    Expression Type: System.Collections.Generic.IDictionary<,>
    
  6. 在顶部的文本区域中输入以下内容作为搜索模式:

    $type$ $value$ = $dict$[$key$];
    
  7. 在底部的文本区域中输入以下内容作为替换模式:

    $type$ $value$;
    if(!$dict$.TryGetValue($key$, out $value$))
    {
        $value$ = new $type$();
        $dict$[$key$] = $value$;
    }
    
  8. 可选:填写顶部的描述。我用了Replace with TryGetValue.

  9. 可选:填写底部的描述。我用的一样。
  10. 可选:选中替换后格式复选框。

完成的对话框应该如下所示:

  1. 单击 Save 按钮。
  2. 回到 Custom Patterns,您可以使用下拉菜单在右侧设置新模式的严重性级别。我选择了建议
  3. 单击 保存 按钮退出选项。

如果您正确设置了所有内容,ReSharper 应使用建议的修复标记匹配模式: