字典中 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
dotnet ConcurrentDictionary 的 GetOrAdd 性能比 TryGetValue 加 TryAdd 低