字典中 TryGetValue 的 Resharper 重构模式

Posted

技术标签:

【中文标题】字典中 TryGetValue 的 Resharper 重构模式【英文标题】:Resharper Refactor pattern for TryGetValue in Dictionary 【发布时间】:2018-09-20 09:24:00 【问题描述】:

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

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# 中有一些新的语法糖可以消除预先声明变量的需要。不幸的是,我无法在我的环境中使用这些功能,并且在可预见的未来也不会。

似乎确实有一个“检查包含键”重构,它实现了几乎相同的结果,但缺点是要进行两次查找。

这可以通过一些扩展来实现吗?我认为这是一个足够普遍的情况,它已经在某个地方解决了。

【问题讨论】:

【参考方案1】:

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

    打开ReSharper |选项...。 转到代码检查|自定义模式节点。 点击添加图案按钮。 选择对话框右上角的替换

    使用添加占位符按钮添加以下四个占位符:

    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<,>
    

    在顶部的文本区域中输入以下内容作为搜索模式:

    $type$ $value$ = $dict$[$key$];
    

    在底部的文本区域中输入以下内容作为替换模式:

    $type$ $value$;
    if(!$dict$.TryGetValue($key$, out $value$))
    
        $value$ = new $type$();
        $dict$[$key$] = $value$;
    
    

    可选:填写顶部的说明。我用Replace with TryGetValue

    可选:填写底部的说明。我也用过。 可选:选中替换后格式复选框。

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

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

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

【讨论】:

哇,感谢您的详细回答。我现在在 VS 中全职使用 Rider 而不是 resharper,我认为它具有相同的设置,但我找不到与您在 Rider 中描述的内容相匹配的任何内容。你知道这是支持的吗? Rider 错误跟踪器上的相关问题很遗憾地表明,这对于 Rider 是不可能的。 youtrack.jetbrains.com/issue/RIDER-11489 这太棒了,尽管我发现它直到我将 dict 更改为标识符占位符而不是表达式占位符后才起作用。 (我的目标是更简单的东西,只是将 value = dict[key]; 变成 TryGetValue 调用,所以我根本不需要 Type 的东西。)

以上是关于字典中 TryGetValue 的 Resharper 重构模式的主要内容,如果未能解决你的问题,请参考以下文章

C#中Dictionary的TryGetValue和Contains

C#中Dictionary的TryGetValue和Contains

Resharp使用简记

检索字典值最佳实践

dotnet ConcurrentDictionary 的 GetOrAdd 性能比 TryGetValue 加 TryAdd 低

C# Dictionary 是不是有可能返回一个完全错误的值。