我们的编码标准要求我们尽量减少C#var的使用(建议限制它与Linq一起使用)。然而,有时候使用泛型,这是非常方便的,例如。
Dictionary<DateTime, Dictionary<string, float>> allValues = ...
// ...
foreach (var dateEntry in allValue)
更容易输入
foreach (KeyValue<DateTime, Dictionary<string, float>> dateEntry in allValue)
(并且比在某些情况下记住显式类型更容易)。
任何重构工具都能够将前者转换为后者。我看过Resharper,但似乎没有(事实上它的默认建议是反方向)。
答案 0 :(得分:19)
我有ReSharper 4.1,它确实提供了这个选项(在任一方向)。
实际上,我建议挑战标准......前者比后者更具可读性(特别是如果你调用变量pair
或类似的东西)。我不会为var i = 0
使用“var”,但它非常适合上述情况。
如需批量更改,请转到:
然后跑......
答案 1 :(得分:12)
这在Visual Studio 2017中是可行的。
工具&gt;选项&gt;文本编辑器&gt; C#&gt;代码风格&gt;一般 -
查找'var'首选项&gt;当变量类型明显时。对于Preference,选择“Prefer explicit type”,对于Severity,选择“Suggestion。”
您现在可以在使用var
时获取灯泡操作,并且可以使用 Ctrl 快速更改为显式类型。快捷方式键。
答案 2 :(得分:4)
Resharper这样做(仅限版本4+我确定) 但我不知道是否有可能简单地将var转换为特定类型的自动 - 最终你需要转到“var”,然后出现一个灯光,让你可以选择明确指定类型
答案 3 :(得分:3)
@Adam - 你不能在这里声明一个类,因为那不是来自IDictionary<,>.GetEnumerator()
的内容 - 但是,你可以通过using
添加别名:
using InnerPair = System.Collections.Generic.KeyValuePair<System.DateTime,
System.Collections.Generic.Dictionary<string, float>>;
然后:
foreach(InnerPair pair in dict) {...}
这只是一个类型别名,所以工作正常。
答案 4 :(得分:3)
DevExpress使用CodeRush支持这一点,他们最近开始免费提供一些重构。您正在寻找的重构是“明确的”
http://devexpress.com/Products/Visual_Studio_Add-in/CodeRushX/
答案 5 :(得分:3)
可能很晚,但我写了一个基于.NET编译器平台的Visual Studio 2015扩展。 Replace var with Type 它是针对正常情况进行测试的,如果有错误,我会尽早修复它,也可以在有人想要贡献或增强此工具的情况下使用它。
答案 6 :(得分:0)
我认为,如果域对象上有复杂的泛型类型,则应该键入它们
class DomainValueCollection : KeyValue<DateTime, Dictionary<string, float>>{}
其中DomainValueCollection在您的域上下文中是有意义的
然后代码变为
var allItems = new DomainValueCollection();
而不是
var allItems = new KeyValue<DateTime, Dictionary<string, float>>();