我们的编码标准要求我们尽量减少 C# var 的使用(建议限制它与 Linq 结合使用)。然而,有时使用泛型相当方便,例如
Dictionary<DateTime, Dictionary<string, float>> allValues = ...
// ...
foreach (var dateEntry in allValue)
更容易打字
foreach (KeyValue<DateTime, Dictionary<string, float>> dateEntry in allValue)
(在某些情况下比记住显式类型更容易)。
是否有任何重构工具能够将前者转换为后者。我已经看过 Resharper 但它似乎不起作用(事实上它的默认建议是朝相反的方向走)。
我有 ReSharper 4.1,它确实提供了此选项(任一方向)。
实际上,我建议挑战标准......前者比后者更具可读性(特别是如果您调用变量
pair
或类似的东西)。我不会使用“var”来表示 var i = 0
,但它非常适合上述内容。
如需批量更换,请访问:
然后跑...
Resharper 做到了这一点(我确信只有在版本 4+ 中) 但我不知道是否可以简单地将 var 自动转换为特定类型 - 最终您需要转到“var”,然后会出现一个指示灯,让您可以选择显式指定类型
@Adam - 你不能在这里声明一个类,因为这不会是从
IDictionary<,>.GetEnumerator()
返回的类 - 但是,你可以通过 using
: 别名
using InnerPair = System.Collections.Generic.KeyValuePair<System.DateTime,
System.Collections.Generic.Dictionary<string, float>>;
然后:
foreach(InnerPair pair in dict) {...}
这只是一个类型别名,所以工作正常。
DevExpress 通过 CodeRush 支持这一点,他们最近开始免费提供一些重构。您正在寻找的重构是“Make Explicit”
http://devexpress.com/Products/Visual_Studio_Add-in/CodeRushX/
可能很晚了,但我编写了一个 Visual Studio 2015 扩展,它基于 .NET 编译器平台来执行此操作。 用类型替换 var 它针对正常场景进行了测试,如果有错误,我会尽快修复它,并且它也是开源的,以防有人想要贡献或增强这个工具。
我认为,当你的域对象上有复杂的泛型类型时,你应该对它们进行 typedef
DomainValueCollection 类:KeyValue>{}
其中 DomainValueCollection 是在您的域上下文中有意义的东西
代码就变成了
var allItems = new DomainValueCollection();
而不是
var allItems = new KeyValue>();