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

问题描述 投票:0回答:7

我们的编码标准要求我们尽量减少 C# var 的使用(建议限制它与 Linq 结合使用)。然而,有时使用泛型相当方便,例如

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

更容易打字

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

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

是否有任何重构工具能够将前者转换为后者。我已经看过 Resharper 但它似乎不起作用(事实上它的默认建议是朝相反的方向走)。

c# refactoring
7个回答
19
投票

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

实际上,我建议挑战标准......前者比后者更具可读性(特别是如果您调用变量

pair
或类似的东西)。我不会使用“var”来表示
var i = 0
,但它非常适合上述内容。

如需批量更换,请访问:

  • 清理代码...(选择一个配置文件=>“编辑配置文件”=>工具=>代码清理)
    • C#
      • 在声明中使用“var”
        • 替换方向 = Can 'var' 来键入用法
        • 'foreach'迭代器声明风格 = 始终使用显式类型
        • 局部变量声明风格 = 始终使用显式类型

然后跑...


17
投票

这在 Visual Studio 2017 中是可能的。

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

查找“var”首选项 > 当变量类型明显时。对于“偏好”,选择“首选显式类型”,对于“严重性”,选择“建议”。

enter image description here

现在,当您使用

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

enter image description here

enter image description here


4
投票

Resharper 做到了这一点(我确信只有在版本 4+ 中) 但我不知道是否可以简单地将 var 自动转换为特定类型 - 最终您需要转到“var”,然后会出现一个指示灯,让您可以选择显式指定类型


3
投票

@Adam - 你不能在这里声明一个类,因为这不会是从

IDictionary<,>.GetEnumerator()
返回的类 - 但是,你可以通过
using
:

别名
using InnerPair = System.Collections.Generic.KeyValuePair<System.DateTime,
    System.Collections.Generic.Dictionary<string, float>>;

然后:

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

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


3
投票

DevExpress 通过 CodeRush 支持这一点,他们最近开始免费提供一些重构。您正在寻找的重构是“Make Explicit”

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


3
投票

可能很晚了,但我编写了一个 Visual Studio 2015 扩展,它基于 .NET 编译器平台来执行此操作。 用类型替换 var 它针对正常场景进行了测试,如果有错误,我会尽快修复它,并且它也是开源的,以防有人想要贡献或增强这个工具。


0
投票

我认为,当你的域对象上有复杂的泛型类型时,你应该对它们进行 typedef

DomainValueCollection 类:KeyValue>{}

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

代码就变成了

var allItems = new DomainValueCollection();

而不是

var allItems = new KeyValue>();
© www.soinside.com 2019 - 2024. All rights reserved.