将C#var重构为显式类型的工具

我们的编码标准要求我们尽量减少C#var的使用(建议限制它与Linq一起使用)。 然而,有时候使用generics的地方比较方便,例如

Dictionary<DateTime, Dictionary> allValues = ... // ... foreach (var dateEntry in allValue) 

更容易打字

 foreach (KeyValue<DateTime, Dictionary> dateEntry in allValue) 

(并且比在某些情况下记住显式类型更容易)。

任何重构工具都能够将前者转换为后者。 我看过Resharper,但它似乎没有做(事实上,它的默认建议是朝相反的方向发展)。

我有ReSharper 4.1,它确实提供了这个选项(在任一方向)。

实际上,我建议挑战标准……前者比后者更具可读性(特别是如果你调用变量pair或类似的东西)。 对于var i = 0 ,我不会使用“var”,但它非常适合上述情况。

如需批量更改,请访问:

  • 清理代码…(选择个人资料=>“编辑个人资料”=>工具=>代码清理)
    • C#
      • 在声明中使用’var’
        • 替换方向=可以’var’来键入用法
        • ‘foreach’迭代器声明样式=始终使用显式类型
        • 局部变量声明样式=始终使用显式类型

并运行…

这在Visual Studio 2017中是可行的。

工具>选项>文本编辑器> C#>代码样式>常规 –

查找’var’首选项>当变量类型明显时。 对于Preference,选择“Prefer explicit type”,对于Severity,选择“Suggestion”。

在此处输入图像描述

现在,当您使用var ,您将获得灯泡动作,并且您可以使用Ctrl快速更改为显式类型 快捷键。

在此处输入图像描述

在此处输入图像描述

Resharper这样做(仅在版本4+中我确定它)但我不知道是否可以简单地将var转换为特定类型自动 – 最终你需要转到“var”然后灯光显示up,它提供了明确指定类型的选项

@Adam – 你不能在这里声明一个类,因为那不是来自IDictionary<,>.GetEnumerator() – 但是,你可以通过using

 using InnerPair = System.Collections.Generic.KeyValuePair>; 

然后:

 foreach(InnerPair pair in dict) {...} 

这只是一个类型别名,所以工作正常。

DevExpress使用CodeRush支持这一点,他们最近开始免费提供一些重构。 你正在寻找的重构是“明确的”

http://devexpress.com/Products/Visual_Studio_Add-in/CodeRushX/

可能很晚,但我写了一个基于.NET编译器平台的Visual Studio 2015扩展。 用类型替换var它在正常情况下进行了测试,如果有错误,我会尽早修复它,并且如果有人想要贡献或增强这个工具,它也是开源的。

我认为,如果域对象上有复杂的generics类型,则应该键入它们

 class DomainValueCollection:KeyValue > {}

其中DomainValueCollection在您的域上下文中是有意义的

然后代码变成了

 var allItems = new DomainValueCollection();

而不是

 var allItems = new KeyValue >();