我无法离开 JetBrains ReSharper 的 15 个理由






4.78/5 (25投票s)
我无法离开 JetBrains ReSharper 的 15 个理由
如果你认识我,你会知道我有多么热爱 JetBrains ReSharper,我每天都在使用它,并且发誓它很好。人们经常问我最喜欢它哪一点,我常常会支支吾吾。事实是,没有一个“杀手级”的原因 为什么我喜欢 ReSharper……它是由许多小功能组合而成的,这使得它成为了一个我真的无法脱离的工具。我将解释我最喜欢的 15 个功能,并敦促你尝试一下。如果你到最后还没被说服,那你将永远不会被转化。请注意,这些理由并没有特定的顺序,只是我想到它们的顺序。这篇文章是用 Visual Studio 2013 和 ReSharper 8.1(撰写时为 EAP 版本)编写的。
重要提示:不要与 ReSharper 抗衡,拥抱它。如果存在让你烦恼的警告/错误/配置,请更改设置!ReSharper 是高度可配置的,JetBrains 的团队已经尽一切努力让 ReSharper 与你协作,而不是与你对抗。
误解: ReSharper 很慢。
JP 说:不,它不慢。我曾用包含 350 多个项目的解决方案使用 ReSharper,没有出现性能不佳的情况。也许在 ReSharper 的早期版本中性能确实存在问题,但我认为现在绝对不是这样了。由于 JetBrains 团队的辛勤工作、Visual Studio 本身的改进以及近年来硬件性能的提升,ReSharper 在后台默默地工作,几乎察觉不到。如果 ReSharper 对你来说很慢,你可能需要考虑买一台新电脑。我说够了。
抱怨:我不喜欢 ReSharper 对 IntelliSense 的处理。
JP 说:个人而言,我也不喜欢。ReSharper 默认会关闭 Visual Studio 的 IntelliSense 并启用自己的版本。我相信它很棒,但个人而言,我从未完全习惯它。你可以在 **ReSharper > Options > IntelliSense** 中,在 **General** 选项屏幕上选择 **Visual Studio**,非常轻松地恢复默认的 IntelliSense。
请确保重启 Visual Studio 以使更改正确生效。
诚然,这个例子有些牵强,但并不罕见。在编写代码时,很容易犯这种微妙的错误。有时你假设代码总是处于特定状态,但总会有这种情况不成立的边缘情况……相信我,如果存在,用户一定会找到它。
毫无疑问,ReSharper 中最有用的代码导航功能是 **转到实现**。与大多数 Visual Studio 版本默认附带的 **转到定义** 不同,**转到实现** 即使在方法位于接口上时,也能直接将你带到方法的正文。在这种情况下,**转到定义** 只能让你到达接口本身,这意味着你必须自己去查找实际的实现,这并不总是那么容易。**转到实现** 确实节省了大量时间。
几秒钟后,实际的底层代码就会呈现给你,就好像它是你自己的项目的一部分一样!
查找所有引用;
查找所有用法;

此外,如果你的解决方案中只有一个属性/方法/类的用法,ReSharper 会自动导航到它。

然后,系统会提示你选择要包含的属性/成员,以及其他选项,然后单击 **完成**。

所有代码都会自动生成,你就可以回到更有趣的事情上去了。
我经常利用 **应用程序配置文件** 以简单的方式持久化设置。要访问这些设置,我需要使用
按下 **alt+enter** 会弹出 ReSharper 菜单,神奇般地!它*知道*我需要添加一个引用;
老实说,它*怎么*知道这一点我真的不知道,而且确实有点碰运气。但当它知道你在说什么时,它会大大节省时间。
最终结果
ReSharper 会突出显示可以提取到资源中的字符串,并给你一个使用老办法 **alt+enter** 组合键自动将其移动到资源中的选项。
ReSharper 会提取该类,创建一个同名的新代码文件,并将你的类放入其中。搞定。
例如;

然后,你可以使用 **alt+enter** 来创建视图,使用你喜欢的布局引擎。或者,如果视图已存在,你可以简单地 **Ctrl + 单击** **View** 直接导航到该视图。
ReSharper 拥有许多内置的代码分析工具来检测代码问题。警告和错误不仅会高亮显示在包含错误的行上,还会显示在代码编辑器窗口旁边的便捷概览栏上。我发现这在查找错误时特别有用。通常,在处理大型文件时,查看文件中所有错误的概览会很有帮助。错误以红色突出显示,警告(非构建关键)以橙色突出显示,建议/提示以绿色突出显示。将鼠标悬停在栏顶部的图标上会显示警告/错误的数量,单击则会将编辑器滚动到下一个警告或错误。
重要提示:不要与 ReSharper 抗衡,拥抱它。如果存在让你烦恼的警告/错误/配置,请更改设置!ReSharper 是高度可配置的,JetBrains 的团队已经尽一切努力让 ReSharper 与你协作,而不是与你对抗。
常见误解和抱怨
首先,一些人过去使用过 ReSharper,但出于某种原因放弃了它。通常,他们有两个主要抱怨。误解: ReSharper 很慢。
JP 说:不,它不慢。我曾用包含 350 多个项目的解决方案使用 ReSharper,没有出现性能不佳的情况。也许在 ReSharper 的早期版本中性能确实存在问题,但我认为现在绝对不是这样了。由于 JetBrains 团队的辛勤工作、Visual Studio 本身的改进以及近年来硬件性能的提升,ReSharper 在后台默默地工作,几乎察觉不到。如果 ReSharper 对你来说很慢,你可能需要考虑买一台新电脑。我说够了。
抱怨:我不喜欢 ReSharper 对 IntelliSense 的处理。
JP 说:个人而言,我也不喜欢。ReSharper 默认会关闭 Visual Studio 的 IntelliSense 并启用自己的版本。我相信它很棒,但个人而言,我从未完全习惯它。你可以在 **ReSharper > Options > IntelliSense** 中,在 **General** 选项屏幕上选择 **Visual Studio**,非常轻松地恢复默认的 IntelliSense。

请确保重启 Visual Studio 以使更改正确生效。
将循环转换为 LINQ 表达式并反向转换
当我学习 LINQ 表达式时,ReSharper 给了我极大的帮助。ReSharper 有一个出色的功能,可以将你的for
和 foreach
循环重写为 LINQ 表达式。以下面为例;private static IEnumerable Discover(string root)
{
List list = new List();
foreach (string directory in Directory.EnumerateDirectories(root, "*.*", SearchOption.AllDirectories))
{
foreach (string link in Directory.EnumerateFiles(directory).Where(file => _searchPattern.IsMatch(file)))
{
list.Add(new Shortcut
{
Path = link, FileName = Path.GetFileNameWithoutExtension(link)
});}}
return list;
}
该方法获取一个目录列表并遍历它们,然后遍历每个目录中的每个文件,并根据预定义标准检查文件。这段代码本身没什么问题,但嵌套循环会变得相当混乱且难以理解,尤其是当你还有嵌套的 **if 语句**时(这种情况非常普遍)。只需单击一次鼠标,整个方法就可以重构为一个简单的 LINQ 表达式;private static IEnumerable Discover(string root)
{
return (from directory in Directory.EnumerateDirectories(root, "*.*", SearchOption.AllDirectories)
from link in Directory.EnumerateFiles(directory).Where(file => _searchPattern.IsMatch(file))
select new Shortcut
{
Path = link,
FileName = Path.GetFileNameWithoutExtension(link)
}).ToList();
}
对大多数人来说,这样更易于阅读和理解。但是,如果你发现自己仍然难以掌握这种风格,相同的单击操作可以将代码重构回嵌套的 foreach
循环风格。ReSharper 还会尽力添加有意义的变量名(而且它做得相当不错)。ReSharper 帮助防止对 IEnumerable 集合进行多次枚举
如今,越来越多的应用程序使用对象关系映射器 (ORM) 编写,并且方法是针对接口编写的,以提高单元测试性和关注点分离。ReSharper 帮助你识别 IEnumerable 的性能影响。以下面为例;IEnumerable shortcuts = Discover(RemoteDesktopPaths);
if (shortcuts.Any())
{
var first = shortcuts.First();
Console.WriteLine(first.FileName);
}
本质上,每次调用 **shortcuts** 时,它都会被执行。这意味着,在这种情况下,映射到数据存储时,你会重复执行相同的查询。这很可能是一项昂贵的操作。ReSharper 会突出显示问题,让你知道需要解决它(例如,通过将 IEnumerable 转换为 List)。转换为 var 并反向转换
当你试图理清另一个开发者的代码时,一个非常有用的技巧是将私有字段转换为var
并反向转换。以下面为例;var shortcuts = Discover(RemoteDesktopPaths);
从这段代码中看不出 Discover
的返回类型是什么。Visual Studio 的 IntelliSense 会在你将鼠标悬停在 var
上时显示类型,但这对我来说还不够。如果我将光标放在 var
上并按下 **alt-enter**,ReSharper 会自动将 var
更改为显式类型。同样,如果我有一个想要更改为 var
的显式类型,我可以按下相同的组合键。
可能发生的“System.NullReferenceException”
一个绝对是“钻石级”的功能,多年来无疑为我节省了大量麻烦……ReSharper 会识别并突出显示可能并且很可能会导致 **Null Reference Exception** 的代码。当然,它的范围通常限于单个方法,但仍然 infinitely 有用。以下面为例;
诚然,这个例子有些牵强,但并不罕见。在编写代码时,很容易犯这种微妙的错误。有时你假设代码总是处于特定状态,但总会有这种情况不成立的边缘情况……相信我,如果存在,用户一定会找到它。
转到实现 - 导航你的代码

毫无疑问,ReSharper 中最有用的代码导航功能是 **转到实现**。与大多数 Visual Studio 版本默认附带的 **转到定义** 不同,**转到实现** 即使在方法位于接口上时,也能直接将你带到方法的正文。在这种情况下,**转到定义** 只能让你到达接口本身,这意味着你必须自己去查找实际的实现,这并不总是那么容易。**转到实现** 确实节省了大量时间。
转到实现 - 深入底层
**转到实现** 将功能进一步提升。它不仅大大简化了导航你自己的代码,还允许你深入底层,查看其他以前无法访问的代码。例如,System.IO
中的 Directory
类提供的 EnumerateFiles
方法。我们没有编写这个方法,默认情况下我们看不到驱动它的代码。正如你可能知道也可能不知道的,.NET Framework 是开源的,这意味着你可以自由阅读(但不能复制代码供自己使用)。通常,你必须下载代码,解压,搜索文件并直接打开它。非常繁琐。另一种方法是使用像 dotPeek 这样的工具来反编译程序集并以这种方式查看代码。同样不理想。**转到实现** 会自动识别程序集,反编译它,并在一个正常的代码编辑器窗口中显示它供你查看。点击 **转到实现**。
几秒钟后,实际的底层代码就会呈现给你,就好像它是你自己的项目的一部分一样!

查找用法
ReSharper 有一个功能可以帮助查找解决方案中所有方法/属性/类的所有用法/引用。当然,Visual Studio 也有这个功能(查找所有引用),但 ReSharper 以一种更易读、因此更有用的方式呈现结果。查找所有引用;

查找所有用法;

此外,如果你的解决方案中只有一个属性/方法/类的用法,ReSharper 会自动导航到它。
冗余代码
在我与团队其他开发人员合作时,我最大的(如果不是唯一最大的)痛点之一是关于冗余代码。具体来说,是冗余的方法、属性和变量。冗余方法是指在解决方案中任何地方都未被调用的方法,或者无法访问的方法。通常,这些是私有方法,但属性和字段也可能存在这种情况。以下面的类为例;[Serializable]
public class Environment
{
public string Name { get; set; }
public string PhysicalPath { get; set; }
public string BackupPath { get; set; }
private void Save(object obj)
{
using (Stream stream = new FileStream("path.dat", FileMode.CreateNew))
{
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, obj);
}
}
}
Save
方法未被使用,并且从外部世界无法访问。它基本上是无用的。因此,为了保持代码整洁,应该删除此方法。毕竟,如果将来需要它,它应该在源代码管理中!(你**始终**应该使用源代码管理,没有借口!)ReSharper 通过使方法/属性名称变暗来指示该方法可以安全删除。你可以使用 **查找所有用法** 功能来仔细检查是否没有任何用法。自动生成相等成员
毫无疑问,这项功能将比其他任何功能都为你节省更多的时间(和理智),ReSharper 可以在 2 次单击中自动生成所有相等性检查代码。以下面的类为例;[Serializable]
public class Environment
{
public string Name { get; set; }
public string PhysicalPath { get; set; }
public string BackupPath { get; set; }
}
我想做以下事情;- 实现
IEquatable<T>
接口,以便我可以进行强类型相等性检查 - 重写标准的
Equals
方法来检查相等性 - 实现相等运算符 (!= 和 ==)
- 重写
GetHashCode
(在重写Equals
时实际上是强制性的)
Equals
,将光标放在方法名上,然后单击 **生成相等成员**。
然后,系统会提示你选择要包含的属性/成员,以及其他选项,然后单击 **完成**。

所有代码都会自动生成,你就可以回到更有趣的事情上去了。
添加未知程序集的引用
在编写代码时,我经常发现自己需要添加对之前未引用的外部程序集的引用。这是什么意思呢?下面举个例子;
我经常利用 **应用程序配置文件** 以简单的方式持久化设置。要访问这些设置,我需要使用
ConfigurationManager
。这个类位于 **System.Configuration.dll** 中,默认情况下未引用它。按下 **alt+enter** 会弹出 ReSharper 菜单,神奇般地!它*知道*我需要添加一个引用;

老实说,它*怎么*知道这一点我真的不知道,而且确实有点碰运气。但当它知道你在说什么时,它会大大节省时间。
将完整属性转换为自动属性
这是另一个在处理遗留代码时特别有用的功能。ReSharper 让你能够通过按 **alt-enter** 来简单地将完整属性重构为自动属性(并反向操作)。以下面为例;private string _backupPath;
public string BackupPath
{
get { return _backupPath; }
set { _backupPath = value; }
}
在自动属性出现之前,拥有像这样的代码非常普遍。现在这被认为是过时的,并且需要进行重构。但重构既耗时,坦率地说,又很无聊。
public string BackupPath { get; set; }
将字符串移动到资源
在开发应用程序时,开发人员越来越需要考虑本地化/国际化。在前台代码中使用单一语言已不再被接受。ReSharper 可以帮助你。作为本地化/国际化过程的一部分,面向用户的字符串必须提取到资源(有时是资源程序集)中,以便可以翻译它们,并在适当的语言中向用户显示适当的版本。
ReSharper 会突出显示可以提取到资源中的字符串,并给你一个使用老办法 **alt+enter** 组合键自动将其移动到资源中的选项。
移动到另一个文件以匹配类型名称
在开发新功能(或更新现有功能)时,创建新类是很常见的。Visual Studio 提供了许多创建这些类的快捷方式。ReSharper 提供的一个特别有用且省时的功能是将你的类移动到同一目录下的一个新文件中,并使用匹配的文件名。以下面为例;public class Shortcut
{
public Location Location { get; set; }
public string FileName { get; set; }
public override string ToString()
{
return Location.Path;
}
}
public class Location
{
public string Path { get; set; }
}
为了在编写代码时不打断思路,我将两个类添加到了同一个代码文件中。这里没什么特别的问题,除了这可能会让以后查找该类变得更加困难(尤其是由其他开发人员)。
ReSharper 会提取该类,创建一个同名的新代码文件,并将你的类放入其中。搞定。
生成视图 (ASP.NET MVC)
ReSharper 在开发 ASP.NET MVC 网站时,我最喜欢的功能之一与创建新视图/导航到现有视图有关。只需创建你的控制器,所有缺失的视图都会被高亮显示。例如;

然后,你可以使用 **alt+enter** 来创建视图,使用你喜欢的布局引擎。或者,如果视图已存在,你可以简单地 **Ctrl + 单击** **View** 直接导航到该视图。
代码质量指示器栏

ReSharper 拥有许多内置的代码分析工具来检测代码问题。警告和错误不仅会高亮显示在包含错误的行上,还会显示在代码编辑器窗口旁边的便捷概览栏上。我发现这在查找错误时特别有用。通常,在处理大型文件时,查看文件中所有错误的概览会很有帮助。错误以红色突出显示,警告(非构建关键)以橙色突出显示,建议/提示以绿色突出显示。将鼠标悬停在栏顶部的图标上会显示警告/错误的数量,单击则会将编辑器滚动到下一个警告或错误。