将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’迭代器声明样式=始终使用显式类型
- 局部变量声明样式=始终使用显式类型
- 在声明中使用’var’
- C#
并运行…
这在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>();