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

时间:2008-11-14 10:44:26

标签: c# refactoring

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

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

更容易输入

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

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

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

7 个答案:

答案 0 :(得分:19)

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

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

如需批量更改,请转到:

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

然后跑......

答案 1 :(得分:12)

这在Visual Studio 2017中是可行的。

工具&gt;选项&gt;文本编辑器&gt; C#&gt;代码风格&gt;一般 -

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

enter image description here

您现在可以在使用var时获取灯泡操作,并且可以使用 Ctrl 快速更改为显式类型。快捷方式键。

enter image description here

enter image description here

答案 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>>();