ReSharper在C#、VB.NET、XAML、XML、ASP.NET、ASP.NET MVC、ASP.NET Core、HTML、ResX 和 Protobuf 中提供了连续代码质量分析功能。 甚至可以在您编译之前立即检测到错误和问题。
ReSharper不仅能够分析设计时中的打开文件,还可扩展其分析能力以覆盖整个解决方案。
假设您将某个成员的可见性从公开改为内部,并假设此成员仅在当前程序集内使用。 现阶段,ReSharper在当前文件中没有找到错误。 然后,开启解决方案级分析,ReSharper会发现某些地方出错。 您可以跳到解决方案中的下一个错误,并发现有人在当前项目外部使用了此成员。
您需要做的就是明确开启解决方案级分析,在此功能分析您的解决方案的代码后,使用专用窗口查看错误列表。
即使不打开该窗口,您仍然可以使用Go to Next Error/Warning in Solution(Shift+Alt+PageDown)和Go to Previous Error/Warning in Solution(Shift+Alt+F12)命令,在解决方案中的错误之间轻松导航。
过去,尝试跟踪代码中的调用序列可能会打开多个Find Results窗口并丢失上下文。 为了解决此问题,ReSharper可以在单个工具窗口中将整个调用序列可视化。 此功能称为Call Tracking,让您可以查看代码中的调用链并进行导航。
得益于对事件、接口和闭包的支持,ReSharper的Call Tracking较Visual Studio自有的调用层次结构有明显的改进。
要可视化调用序列,请选择 ReSharper | Inspect | Outgoing Calls 或 ReSharper | Inspect | Incoming Calls,或者使用 Inspect This 快捷功能。
ReSharper让您可以在单个工具窗口(名为Inspection Results)中查找所有代码质量问题、冗余、语言使用机会和代码改进建议。
要查找特定范围内的代码问题,请选择ReSharper | Inspect | Code Issues in Solution或ReSharper | Inspect | Code Issues in Current Project。 或者,在Solution Explorer中选择节点,点击右键,然后选择Find Code Issues。
Inspection Results窗口让您可以筛选检测到的问题,按照问题类型、严重性、类别和其他属性对结果进行重新分组,并将结果导出到文件中。
值跟踪可为您提供程序中数据流的重要相关信息。 在源代码中的任何位置,您可以指向变量、参数、字段或属性,并要求ReSharper进行检查。 然后,您会看到它的值如何在程序中流动,返回到它的源或直接流到消费者。
值跟踪可以帮助您确定不正确的特定值如何传递到程序中的特定点,以及它可能继续传到的位置。 这将有助于您调查可能的NullReferenceExceptions、不恰当的行为和您获得不正确值的原因。
要可视化包含特定值的数据流,请选择 ReSharper | Inspect | Value Origin或ReSharper | Inspect | Value Destination,或者使用 Inspect This 快捷键功能。
ReSharper提供1200多个快速修复,可以帮助您即时修复 C#、VB.NET、XAML、ASP.NET 和其他支持语言中检测到的大多数代码问题。 要应用快速修复,只需在高亮显示的代码问题上按Alt+Enter,然后选择最佳方法来修复问题或改进代码。
1、应用快速修复
快速修复通常由红色 (用于错误) 或黄色(用于警告、建议和提示)灯泡表示,当您在高亮显示上设置脱字符号时,该灯泡出现在高亮显示的代码行的左侧。 您可以通过点击灯泡或按Alt+Enter来查看给定错误的可用快速修复列表。 然后只需从列表中选择适当的快速修复,问题将以最方便的方式得到解决。
2、修复范围
一些快速修复(例如,Remove unused directives、Make field read-only和Remove redundant cast等)可以在更大的范围内自动查找和修复问题:在当前文件中、在当前项目中或在整个解决方案中。
您可以通过旁边显示的小箭头识别此类修复。 点击此箭头或按键盘上的向右箭头键可以选择应用修复的位置。
3、修复未解析的符号
对于由未解析的符号引起的错误,ReSharper提供了许多不同的快速修复,例如:
(2)如果解决方案中任何位置引用的某个命名空间中存在符号,则 ReSharper 会显示一个弹出窗口,建议将所有缺失的命名空间导入文件。
(2)一组 Create… 快速修复将帮助您根据用法上下文快速生成符号的各种声明。
(3)修复问题的另一种方法是Find this type on nuget.org…。 它将调出 NuGet Browser,随后帮助您找到并安装缺失的 NuGet 软件包。
4、交互式快速修复
在代码中创建新符号的快速修复通常是交互式的,就像在这个示例中,ReSharper通过将枚举强制提前到List<>变量来帮助您修复IEnumerable的多个枚举。
当ReSharper使用红框高亮显示必要的输入字段时,您可以接受建议值或进行修改,然后按Tab或Enter移动到下一个输入位置,或者按Shift+Tab移动到上一个输入位置。 完成最后一个输入字段后,您的脱字符号将返回正常模式。
5、快速修复与上下文操作
ReSharper 还提供了上下文操作(在下拉列表中显示)和快速修复。
它们之间的区别十分明显:快速修复仅针对高亮显示的代码问题显示,旨在修复这些问题;上下文操作则表示始终在Alt+Enter下拉菜单中可用的小重构。
6、您的自定义快速修复
ReSharper 提供了 Structural Search 和 Structural Replace,用于查找与某个模式匹配的代码,并选择性地将其替换为与另一个模式匹配的代码。 更令人兴奋的是,ReSharper可以通过高亮显示与您的搜索模式匹配的代码来持续按照这些模式监控解决方案,并提供快速修复,根据您的替代模式替换代码。
当您需要对代码进行小幅更改时,ReSharper的上下文操作可以帮助您避免许多输入操作。 更改访问修饰符、生成检查null的代码、将foreach转换为for以及反向转换 — 所有操作只需按几次键即可完成。 在C#、VB.NET、XAML、ASP.NET 和其他支持的语言中可以使用超过450种上下文操作。 在您想要更改的代码元素上按Alt+Enter,然后选择要应用的上下文操作。
1、应用上下文操作
只要上下文操作可用于当前脱字符号位置,ReSharper 就会在脱字符号左侧显示锤头图标 。 如果有多个可用的上下文功能(它们可能是上下文操作和快速修复的组合),将会显示优先级最高的操作的图标。 点击操作指示器或按Alt+Enter可以查看所有可用操作。
相似的上下文操作(例如,用于不同访问修饰符的操作)通常会组织到一起。 在这种情况下,使用向右箭头展开组可以选择所需的操作。
2、在更大的范围内应用上下文操作
一些上下文操作(Remove #regions、Specify enum member values和Add name to argument,等等)可以在更大的范围内自动应用:在当前方法、类、文件、项目中或在整个解决方案内。 您可以点击右侧的小箭头或按键盘上的向右箭头键,选择在何处应用转换。
3、上下文操作与快速修复
ReSharper 还提供了快速修复(可以在下拉列表中显示)和上下文操作。 它们之间的区别十分明显:快速修复仅针对高亮显示的代码问题显示,旨在修复它们并改进您的代码;而上下文操作则是一些小重构,它们可以简单地更改代码。
需要注意的一点是,快速修复具有更高的优先级,如果脱字符号处有任何快速修复,您需要按Alt+Enter来查看此处是否有任何上下文操作。
ReSharper的重构在数量、实用性和应用范围方面远超Visual Studio的重构。 每种重构都可以分析它应用到的整个代码选择范围(甚至整个解决方案),包括跨语言代码,并使用这种洞察以最智能的方式更新代码。
可用于 C# 的所有 ReSharper 重构大多数也适用于 VB.NET,一些适用于 ASP.NET、XAML 和其他支持的语言。
您可能还想要查看 ReSharper 的上下文操作,它们会按照 Martin Fowler 定义的方式实现不太复杂、大多数为局部代码转换且不真实的重构。
要使用重构,您可以将脱字符号放置在以下位置:
(1)文本编辑器中的符号上。
(2)文本编辑器中的代码选择上。
(3)Solution Explorer工具窗口中的一个文件或多个文件上。
(4)File Structure 或另一个 ReSharper 工具窗口中的一个类型成员或多个类型成员上。
之后,您可以从ReSharper的Refactor菜单或使用ReSharper单独的键盘快捷键调用所需重构。 或者,Refactor This命令(Ctrl+Shift+R)会让您查看哪些重构可以在当前脱字符号位置或当前选择处应用。
1、Convert Extension Method to Plain Static
这种无对话框重构可以将扩展方法转换为同一类中的静态方法。 反向功能由Convert Static to Extension Method提供。
2、Convert Static to Extension Method
此重构可以将静态方法转换为扩展方法。 为了成功地执行转换,静态方法必须(1)至少包含一个参数,并且(2)位于静态类中。 反向功能由 Convert Extension Method to Plain Static 提供。
3、Convert Interface to Abstract Class
如果您想要将某些逻辑添加到接口或者您希望它最好是类,应使用此重构。 此重构可以检查任何冲突,例如,实现已包含基类型的接口的类型(在C#中会出现错误,这种语言不包含多个继承)。
4、Convert Abstract Class to Interface
您可以应用此重构,将抽象类转换为接口。 如果您想要从多个抽象类中继承某个类,则需要将其中一个类转换为接口。此重构在这种情况下特别有用。
5、Extract Superclass
使用此重构,您可以为类创建基类并将一些成员移动到基类中。 只需将脱字符号放置在类声明处,选择要提取的成员,然后运行重构。 当您将逻辑在继承性层次结构中向上移动以便稍后共享时,此重构将非常有用。
6、Introduce Parameter
在方法中选择表达式或局部变量,然后使用此重构从它创建新参数。 在维护逻辑和语义时,所有调用点将更新以反映更改的签名。
如果表达式使用在调用点无法访问的局部变量,此重构允许将它们作为委托传递。
7、Make Method Static/Shared
此重构可以通过生成方法的 this 参数,将非静态方法转换成静态方法(在 VB.NET 中为“共享”)。 重构后,目标方法将声明为静态(在VB.NET中为“共享”),而必需参数将添加到它的调用点中。 如果您想移动非静态方法(在VB.NET中为“非共享”),也可以使用此重构。 在这种情况下,请将Make Method Static用作Make Method Non-static重构的准备步骤。
8、Make Method Non-Static/Non-Shared
此重构可以将静态方法(在VB.NET中为“共享”)转换成选定参数类型的实例方法(即将方法移动到参数的类型中并将参数转换成this),并相应地转换方法调用。
9、移动实例方法
使用此重构,您可以快速地将实例方法从当前类型移动到方法参数中出现的一个类型。
10、Move Static Member
此重构可以将静态字段和方法移动到其他类型。 如果您想移动非静态方法,请使用Move Instance Method。
11、Move String to Resource
作为 ReSharper 国际化功能包的一部分,此重构有助于将可以本地化的字符串提取到资源文件中。 在重构期间,显式字符串用法将替换为对资源包装器的引用。
您可以使用专用的快捷键或Refactor This命令调用此重构。 不过,ReSharper也可以高亮显示未作为代码检查放置于资源文件中的字符串,并以快速修复的形式建议Move String to Resource重构。 请参阅 ReSharper 帮助,了解如何配置 ReSharper 执行此操作。
12、Pull Members Up
此重构可以帮助您将类型成员移动到超类或接口。 作为一种泛化行为的方式,此操作十分有用。 ReSharper会分析当前类中的所有成员,并以列表形式显示您可以向上拉取的成员。 在完成重构之前,ReSharper也会检查有无可能的冲突,例如,您尝试移动到超类的成员是否可以在目标类型中访问。 反向功能由Push Members Down提供。
13、Push Members Down
此重构可以帮助您将类型成员移动到子类型,以清理您的类型层次结构。 作为一种专用化行为的方式,此操作十分有用。 ReSharper会分析选定类型的所有成员,并以列表形式显示您可以向下拉取的成员。 在完成重构之前,ReSharper也会检查有无可能的冲突,例如,您尝试向下拉取的成员是否可以在目标类型中访问。 反向功能由Pull Members Up提供。
14、Pull Parameter
在您将新参数添加到方法时(无论使用快速修复还是 Change Signature 重构),ReSharper 不仅会更新签名和方法的所有用法,还会分析方法所属的调用链,并允许您将新参数拉取到此链中的任意位置。
15、Rename
Rename重构允许您重命名任何符号,包括:命名空间、类型、方法、参数、局部变量、属性、字段和事件。 它会自动查找并更正符号的所有引用。 Rename重构可以直接从编辑器调用,有时也可以从其他视图(类视图、对象浏览器)调用。
重命名适用于所有支持的语言和技术,包括 C#、VB.NET、ASP.NET、XML、XAML 和生成脚本。
您在使用Rename重构时,自动引用更正会完全扩展到XAML标记。 另外,可以轻松地重命名特定的XAML符号,例如命名空间别名和资源。
对于生成脚本,当您使用ReSharper重命名属性或目标时,它的所有引用,甚至注释和字符串中的用法都会自动更新以反映更改。
16、转换形参
此重构可以创建新类或结构并将选定方法的参数转换为新创建类型的封装字段。 参数用法会转换为正在创建的类型的属性的用法。
它也可以让您移除out参数:对于void方法,一个或多个out参数会转换为使用元组对象的返回(如果需要);对于非void方法,它们可与现有的返回类型(同样使用元组对象)相结合。
Transform Parameters重构结合并替换了两个其他重构:Transform Out Parameters和Extract Class from Parameters。
17、将构造函数替换为工厂方法
此重构可以使用会返回类的新实例的静态方法封装构造函数。
工厂方法模式是一种创建对象的方法,无需指定要创建的对象的具体类。 ReSharper会为创建对象生成单独的方法。 子类可以重写这个方法以指定要创建的对象的派生类型。
18、Use Base Type where Possible
使用此重构,通过将特定类型用法替换为对其基类型或接口(如有可能,即不使用派生类型的成员时)的引用,可以将您的代码泛化。 如果使用Pull Members Up重构,此重构会特别有用。
19、Copy Type
借助此重构,只需几秒钟,您就可以使用不同名称或在另一个命名空间内创建类型的副本。 ReSharper将为它创建单独的文件。 对于部分类型,即使它们位于单独的文件中,也会复制所有部分。
20、Convert Anonymous to Named Type
此重构会将当前方法(局部)或整个解决方案(全局)范围中的匿名类型转换为命名类型。 在此重构提供的对话框中,您可以指定ReSharper应生成自动属性还是包含支持字段的属性,也可以选择生成相等和格式化方法重载。
21、Convert Indexer to Method
此重构与 Convert Property to Method 很像,但它应用于索引器(在 VB.NET 中为默认属性)。 您可以只将getter或setter转换为方法,也可以同时转换两者。 反向功能由Convert Method to Indexer提供。
22、Convert Method to Indexer
这是Convert Indexer to Method的反向功能。 它以无对话框模式运行,但您需要将它应用到两个方法,以便在您的索引器中生成getter和setter。
23、将方法转换为属性
此重构允许用户将不包含参数的非void方法转换为具有读取权限的属性,将包含一个参数的void方法转换为具有写入权限的属性。 配对方法可以转换为单一的读取/写入属性。
24、Convert Property to Auto-Property
此重构可以帮助您将包含私有支持字段的属性转换为自动实现的属性(也称为自动属性)。 此重构会移除支持字段并使用新创建的自动属性替换它的所有用法。
25、Convert Property to Method
使用此重构,具有读取权限的属性可以转换为getter类型的方法(不包含参数的非void方法),具有写入权限的属性可以转换为setter类型方法(包含一个参数的void方法)。 对于具有读取和写入权限的属性,您可以将它们转换为成对的getter类型和setter类型方法。
26、Extract Class
您有一个类正在完成实际上应当由两个不同的类完成的任务吗? 使用此重构可以将复杂的类分解成两个单一职责的类。 Extract Class会帮助您选择要从旧类移动到新类的方法和字段。 对于任何中断的依赖项和可访问性问题,它还会发出警告,并建议冲突解决方案选项。
27、Extract Interface
此重构允许您从类创建接口并让该类实现已创建的接口。 您可以选择要提取到接口的成员并为接口指定名称。
28、Extract Method
选择代码块并调用Extract Method重构,以便将它转换为方法(在VB.NET中为Sub或Function)。 ReSharper会自动分析代码以检测返回值和/或out/ref参数。
29、Introduce Field
选择表达式或局部变量并应用此重构。 它将创建新的字段或常量,并使用表达式或局部变量初始值设定项将它初始化。 可以在字段的初始值设定项、类型构造函数或当前成员中为字段赋值。
30、Inline Field
当字段具有单个写入用法时,此重构会使用字段的初始化表达式替换它的读取用法,同时删除字段声明和写入用法。
31、Encapsulate Field
Encapsulate Field重构允许您从现有字段快速地创建访问器属性。 字段的用法会自动替换为属性的用法。 此重构明显的好处是,您可以不允许使用属性直接访问字段。
32、Inline Method
如有可能,此重构就可以将方法的主体转换为其调用方的主体并一同移除方法。 反向功能由Extract Method提供。
33、Introduce Variable
选择成员代码中的任意表达式并调用Introduce Variable重构。 新的隐式或显式类型的局部变量将使用选定的表达式声明和初始化。 原始表达式会被替换为变量的名称。 如果您的代码中有原始表达式的多个实例,则可以选择使用新创建的变量替换所有表达式。 以同样的方式,您也可以为常量表达式引入常量。
34、Inline Parameter
此重构可以帮助您将方法的参数移动到它的主体中。 例如,如果同一常量值传递到它的所有调用中的方法,那么,可以将参数移除并在方法主体中添加相应的局部变量。
35、Inline Variable
选择任意变量或局部常量并调用“Inline Variable”重构。 代码中选定变量的所有实例都会替换为它的初始值设定项。 反向功能由Introduce Variable提供。
36、Introduce Variable for Substring
此重构可以帮助您快速地将字符串的一部分移动到单独的变量中。 根据目标C#版本的不同,重构将使用字符串内插或将字符串包围到String.Format()中。
37、Move Types into Matching Files
此重构可应用到单个文件或每个文件包含多个类型的许多文件。 ReSharper会为每个类型创建专用文件并将它们移动到相应位置。
如果您想先使用类型,然后利用 ReSharper 的 Create from Usage 功能声明它们,那么“Move Types into Matching Files”将不可或缺。
此重构还有一个快捷键,在与它所属文件的名称不匹配的类名称上按Alt+Enter可以调用此快捷键。
38、Move to Folder
此重构可以帮助您将一个类、一个文件、许多类或文件移动到解决方案中的另一个项目或文件夹中。 执行移动时,ReSharper会根据需要更新using指令。 或者,它可以根据新位置重命名命名空间并分发正移动到单独文件中的类。
39、Move Type to Outer Scope
此重构可以将内部类型移动到上一级。 在内部类型使用封闭类型的成员时,封闭类型的引用会作为一个参数传递到移动类型的构造函数。 可以通过Move重构命令访问此重构。
40、Move Type to Another File or Namespace
您可以在命名空间中轻松地移动类型,ReSharper会自动更新引用。 您也可以将类型移动到外部或将嵌套范围移动到另一个文件。
使用此重构,您可以将实现特定类型的代码快速移动到单独的文件中。 可以通过Move重构命令访问此重构。
在您使用XAML并将.NET类移动到另一个命名空间时,会更新类的XAML标记引用,以及相应地插入/更改XAML导入指令。 还可以在任何类型引用上直接从XAML标记调用此重构。
41、Safe Delete
如果您要删除C#或VB.NET代码文件、ASP.NET代码与标记、生成脚本或XAML中的类型、类型成员或任何其他符号,使用此重构可以确保删除操作安全无误。 如果无法找到符号用法,或者有一些可安全折叠的用法,将删除该符号。 否则,ReSharper将为您显示无法安全删除的所有用法,允许您编辑相应的代码。
此重构可应用于多个文件或文件成员,让您能够安全地删除整个子系统。
当您在生成文件中的对象或属性上调用Safe Delete时,ReSharper会执行所有必要的验证和操作以移除选定符号。 ReSharper还可以为您移除任何冲突的引用。
42、将成员提取为分部
此重构可以帮助您在部分类的不同类型部分之间快速地移动类型成员。 根据您的输入,重构会使用现有的类型部分或创建新的类型部分。
Go to Action
ReSharper可以帮助您快速查找和应用任何操作,而无需深挖菜单(对于操作,我们是指当前脱字符号位置可用的可执行命令或者可以打开工具窗口的命令)。 要查找操作,只需在编辑器中的任意位置按Alt+Enter,并输入命名名称或相关词语。借助ReSharper的导航功能,您可以轻松地遍历整个解决方案。 跳到基本代码中的任何文件、类型或成员,或者从特定符号导航到其用法、基本符号与派生符号或者实现。
1、Navigate To
Navigate To是一种适用于所有上下文导航的快捷键。 Navigate To可以列出当前脱字符号位置可用的所有目标。 按Alt+`可以获取以下对象的快速导航链接:声明、类型声明、基类、继承者,或脱字符号下符号的用法;接口的接口实现和函数的函数出口,等等。
2、Go to File Member
要快速导航到当前文件中的特定方法或字段,请使用Go to File Member命令,此命令可以通过按Alt+调用。 与Go to Type一样,输入符号名称,然后从匹配成员的列表中选择。 此功能适用于所有支持的语言中的文件成员。
3、Go to Everything/Go to Type
此命令(可以通过按Ctrl+T调用)结合了两种不同的功能:
Go to Everything会首先出现,它可以快速导航到所有可能的目标(类型、符号或文件)。 建议列表会在您调用此命令后尽快出现,最初包含您最近导航到的文件和代码位置。 列表会根据您的输入实时更新。 您可以使用以/开头的特殊内联命令,对搜索结果进行高级筛选。
Go to Type会在您重复按此快捷键时出现,它让您可以导航到您的解决方案中的任何类型。
这两个功能和其他“Go to”功能还支持通配符:*(星号)表示零个或多个字符;使用双直引号引起搜索查询将执行精确匹配搜索;精确匹配搜索中的一个?(问号)表示一个字符。
4、用于文本搜索的“Go to Text”
借助此导航操作(可以通过按Ctrl+T、T、T调用),您可以快速查找并导航到解决方案中包含的源文件和文本文件中的任何文本。 与其他导航命令类似,如果有太多的匹配项,您可以按数字键盘上的+,在Find Results窗口中查看结果。 您还可以使用特殊的内联命令来减少搜索结果的数量:/cp可以在当前项目中搜索,/ext:可以在具有特定扩展名的文件中搜索,/fm:可以搜索特定的文件掩码。
5、Go to Implementation
借助此导航功能(可以通过Ctrl+F12快捷键调用),您可以从基类型或成员跳到任意的最终实现,跳过继承链中的中间步骤。
它与 Go to Derived Symbols 类似,但在您需要绕过类型层次结构中的一个或多个级别时帮助您节省时间。 观看GIF以查看差异。
6、Go to Action
ReSharper可以帮助您快速查找和应用任何操作,而无需深挖菜单(对于操作,我们是指当前脱字符号位置可用的可执行命令或者可以打开工具窗口的命令)。 要查找操作,只需在编辑器中的任意位置按Alt+Enter,并输入命名名称或相关词语。
7、Go to Exposing APIs
此命令可以通过 Navigate To 快捷键调用(按 Alt+`),能够从类型导航到解决方案中您可以获取此类型的实例的所有位置:公共字段与属性、方法返回值和输出参数,等等。
8、Go to Symbol
Go to Symbol命令可以按名称和解决方案级搜索方法、字段和其他文件成员。 按Shift+Alt+T可以调用此命令。 请注意,ReSharper 的所有“转到”命令(包括 Go to Symbol)都支持不区分大小写的 CamelHumps。 也就是说,您可以输入第一个字符和成员名称中包含的任意后续字符,更快地查找成员 - 例如,您可以通过输入tfixs来查找testFixedSizeBuffer。
9、Go to Base
在编辑器中将脱字符号放到某个类型或方法的用法或声明上,然后按Alt+Home,您可以在层次结构中向上导航到基类型或方法。
此外,您还可以查看方法声明左侧出现的特殊装订区域图标,查看某个方法何时重写、实现或隐藏其他方法。 点击图标可以在方法层次结构中向上导航。
10、Go to Declaration
要导航到符号的声明,请将脱字符号放在任意符号用法处,然后按F12,或者按住Ctrl并点击符号。 ReSharper将跳到相关源文件中的对应类型、方法、字段或局部变量的声明。 对于库符号,对应的实体将显示在Visual Studio的对象浏览器中,或者以元数据视图或反编译代码的形式显示在编辑器中,具体取决于ReSharper设置。
11、在用法之间导航
如果您的脱字符号已经位于符号声明处,您还可以调用Go to Declaration命令。 如果您只有一个声明和一个用法,则可以使用一个快捷键轻松在它们之间导航。 如果某个符号有多个用法,后续点击Go to Declaration会将您定位到符号的其他用法,一次一个用法。 一个类似Find Usages的窗格可以为用法之间的导航提供辅助,此窗格可以枚举找到的用法,包含在用法之间点击的其他控件,如果您喜欢,还可以将找到的所有用法刷新到常规的Find Results窗口中。
12、Go to Related Files
此功能(可以通过按Ctrl+Alt+F7调用)能以多种方式将您从当前文件转到引用的任何文件。 此功能对于 Web 站点和应用程序非常有用:例如,借助此功能,您可以从 Web 表单跳到它的主控页、用户控件、引用的图像。 在ASP.NET MVC应用程序中,此功能可以简化视图与控制器之间的导航。
要详细了解 ReSharper 为 Web 开发者提供的高级导航和其他功能,请参阅 ASP.NET 和 ASP.NET MVC 工具。
13、Go to File Nearby
此功能可以通过 Navigate To 快捷键(Alt+`)调用,能够帮助您在当前文件中快速导航项目结构。 在打开的弹出窗口中,您可以查看当前文件所属的项目以及位于相同目录级别的文件夹与文件,您还可以轻松跳到这些文件或者创建新文件或文件夹。
14、导航到库代码
任何解决方案都包含自己的源代码和对库的引用。 我们原本以为如果您能导航到这些库以及在这些库之间导航会非常方便,就像您在源代码中一样。
某些公司使用调试信息文件(PDB)的“源服务器”功能发布部分源代码。 另一方面,Microsoft使用这种技术提供.NET Framework源代码的访问权限。 如果您有PDB并且安装了ReSharper,则可以访问以这种方式存储的源代码,如同它们是您的解决方案的一部分一样。 如果您想查看某个具体的.NET Framework类包含什么,ReSharper也可以向您显示。
即使源服务器不可用,也不用担心:ReSharper能够从元数据重建库代码的结构。
下面是ReSharper在源服务器可用时的运行方式:
(2)您在库符号上点击Alt+`,打开包含导航选项列表的Navigate To。
(2)您为库符号选择外部导航选项。
(3)ReSharper从源服务器中下载PDB文件。
(4)ReSharper显示选定的库符号声明,如同声明在您的解决方案中定义的一样。
15、Find Usages
Find Usages可以快速定位您的代码中的任何符号(类型、方法和字段,等等)的用法。 只需将脱字符号放在您想要查找其用法的符号上,然后按Shift+F12。 如果您有一个混合语言项目,可以使用ReSharper在多个语言之间查找用法。
搜索结构显示在Find Results窗口中,并以层次结构形式组织。 从此窗口中,您可以使用键盘或鼠标直接导航到任何用法。 Find Results的附加功能提供了多种处理搜索结果的方式,包括:
(1)预览源代码
(2)高亮显示已中断或未完成的用法
(3)按读取或写入用法、调用用法、特性用法和文档中的用法等条件进行筛选
(4)按用法类型和按类别进行分组
(5)以标签形式组织最近用法搜索,等等
当Find Results窗口打开时,您可以按Ctrl+Alt+PageUp/PageDown(即使在编辑器中也可以),在用法之间导航。
16、Find Usages Advanced
要指定搜索范围和可以找到的用法类型,请使用Find Usages Advanced功能,此功能可以通过按Ctrl+Shift+Alt+F12调用。
根据上下文的不同,您可以在解决方案中精确指定搜索范围;是否在引用的库中搜索;是否查找文本实例、实现属性或者对您正在查看的符号的动态引用。
17、File Structure
File Structure窗口适用于所有支持的语言和文件类型。在C#或VB.NET文件中,您可以查看这些文件包含的方法、字段、类和区域,以及直接导航到它们的声明 - 只需按Ctrl+Alt+F。
在ASP.NET中,借助File Structure,您可以检查当前打开的文件的标记、scriptlet、控件和其他结构化元素,并直接导航到它们的声明。 请参阅 ASP.NET 和 ASP.NET MVC 工具,详细了解此功能和其他导航功能如何帮助 Web 开发者。
在生成脚本中,File Structure让您可以查看当前脚本包含哪些属性和目标。
此窗口还让您可以通过简单的拖放操作在文件中重新排列项,调用导航操作与重构,以及创建和删除区域。
File Structure窗口与编辑器完全同步。 对文件所作的所有更改都会立即反应在File Structure窗口中,反之亦然。
18、使用Tab进行结构化导航
借助ReSharper,您可以使用Tab和Shift+Tab键在代码的逻辑部分之间导航,与您在Web浏览器中的导航方式类似。
例如,编辑for语句时,Tab将依次选择初始化表达式语句、终止条件和迭代器语句。 Shift+Tab将以相反的顺序进行这些选择。
当光标位于代码行中首个非空白字符之前时,您仍然可以使用Tab设置缩进。
19、IL Viewer
借助中间语言查看器,您可以深入挖掘第三方库代码,并显示与您自己的源代码对应的中间语言(请注意,您需要先进行编译)。
要查看IL Viewer的运行原理,请在菜单中选择ReSharper | Windows | IL Viewer。
20、Stack Trace Explorer
当您收到外部堆栈跟踪(例如,从错误报告)时,您可以将其复制并粘贴到Stack Trace Explorer中以导航到引起异常的位置。 堆栈跟踪中的代码行将以超链接形式表示。 要打开Stack Trace Explorer,请将堆栈跟踪复制到剪贴板中并按Ctrl+E、T。
22、Go to File
Go to File可以将您导航到解决方案中的任何文件。 此命令的快捷键为Ctrl+Shift+T,支持其他“转到”命令中使用的所有搜索技术和通配符。
23、Go to Derived Symbols
借助此命令,您可以通过按Alt+End快捷键导航到派生类型或方法。 直接继承者以粗体高亮显示。
24、Go to Generic Substitutions
此命令可以通过 Navigate To 快捷键调用,可以显示能够替换某个选定通用类型参数的所有类型列表,以及使用每个替换的所有代码位置。
25、Go to Type Declaration
按Ctrl+Shift+F11可以导航到某个变量、字段或参数所属的类型的声明。 ReSharper将为库类型切换到源代码中的声明,并在对象浏览器中显示对应的符号,或者显示反编译代码。
26、Go to Next Member/Go to Next Tag
按Alt+Up,您可以在C#或VB.NET代码文件中快速转到下一个文件成员,或者在XML或XAML文件中转到下一个标记。
27、Go to Previous Member/Go to Previous Tag
与Go to Next Member类似,此功能可以让您转到上一个成员或标记 - 只需按Alt+Down即可。
28、Go to Usage
您可以按Shift+Alt+F12,快速导航到具有多个用法(例如具有私有字段)的符号。 它可以在弹出窗口中显示用法,而不用打开整个工具窗口。
不过,如果显示符号用法列表的弹出窗口包含过多的项,只需点击弹出窗口右上角的放大镜图标,即可将用法列表转移到“Find Results”窗口中。
29、高亮显示用法
要在当前文件中高亮显示某个符号的所有用法,只需将脱字符号放在任何符号用法上,然后按Shift+Alt+F11。 您还可以高亮显示命名空间导入指令,甚至表达式的用法。 在大文件中,您可以使用右侧的标记栏在高亮显示的用法之间导航。
ReSharper可以在XAML标记和语言内快速查找并高亮显示符号用法。
30、结构化搜索和替换
借助此功能,您可以创建模式来搜索ReSharper原生无法检测的代码异味或旧代码,并将其替换为优质代码。 不仅如此,为了轻松重复移除有问题的代码,您还可以创建自定义代码检查,并设置 ReSharper,使之为代码提供快速修复。
生成模式和强化良好实践从未如此简单。 公司和团队策略、自定义框架、最喜爱的开源库和工具 - 结构化模式可以全部覆盖。 作为奖励,您可以导入和导出最佳模式,并将它们与同事分享或者在ReSharper安装之间移动。
31、类型层次结构
借助ReSharper,您可以在专用窗口中查看某种类型的继承层次结构。 此窗口可以显示选定类型的基类型和继承者,并且让您只需点击一下即可导航到任意项。 对于层次结构中的任何节点,您可以在单独的预览窗格中查看所有成员或仅查看多态成员。
要为某个类型打开类型层次结构窗口,请将脱字符号放在类型名称处,然后按Ctrl+Alt+H,或者选择ReSharper | View | Type Hierarchy。
32、书签
这是一个简单但强大的功能:您可以使用一个快捷键拖动带编号的标记,并使用另一个快捷键随时跳回来。 您可以创建多达10个带编号的书签以及无数个不带编号的书签。 已加入书签的位置的完整列表将在一个弹出窗口中显示,以加快代码点之间的导航。
33、View Recent Files
按Ctrl+,可以打开一个弹出窗口,其中包含最近打开的文件的列表,您可以在此窗口中选择并导航到任何项。
34、View Recent Edits(和Go to Last Edit Location)
View Recent Edits和View Recent Files类似,可以显示一个弹出窗口,其中包含您最近修改的文件和符号的列表。 如果您的当前编辑会话已开始一段时间,则可以输入您想重新打开的文件的名称,缩小列表。
或者,也可以使用Go to Last Edit Location(Ctrl+Shift+Backspace),将脱字符号快速定位到您最近更改代码的位置,这样就无需显示弹出窗口。 后续点击此快捷键让您可以更深入地查看编辑历史。
35、To-do Explorer
To-do Explorer可以帮助您跟踪使用todo、note和/或bug标记标注的所有提醒项,以及引发NotImplementedException的代码位置。 To-do Explorer可以从您的解决方案的所有文件中检索所有此类项,并在一个工具窗口中显示。
如果您使用自己的标记在代码备注中进行标注,则可以配置自定义模式,To-do Explorer也能进行查找。
36、Process Explorer
Process Explorer窗口可以显示当前正在运行的所有进程,并且可以探索进程的模块并对其中的.NET程序集进行反编译。
您可以选择显示或隐藏原生进程和模块,或者打开进程层次结构视图。
ReSharper提供了多种功能,可用于获取代码的其他信息,选择和高亮显示结构化代码块以及应用局部代码转换。
ReSharper 的上下文操作可以对脱字符号处的代码快速进行小幅更改,让您避免许多输入操作 - 例如,您可以更改访问修饰符,生成检查 null 的代码,将 foreach 转换为 for 及反向转换 - 所有操作只需按几次键即可完成。 如果一个或多个上下文操作可用于当前脱字符号位置,ReSharper 会显示锤头图标 :您可以点击此图标或按 Alt+Enter 选择合适的操作。
此功能会插入必要的语法元素(大括号、分号,等等),并让您处于合适的位置以开始下一个语句,从而让您不会在脱字符号上花费过多精力。 工作时,请牢记此功能默认的快捷键为:Ctrl+Shift+Enter。
补全语句(也称为智能输入)可以在多种情况下解决问题;包括自动插入右括号,添加分号,补全if、while和for语句,等等。
如果字符串文字包含一些其他正式语言,ReSharper 可以提供代码检查、快速修复、代码补全、上下文操作,以及特定于这段节选中此语言的许多其他功能。
在无法自动检测字符串文字中的正式语言时,ReSharper允许您手动将文字标记为包含特定语言。您可以使用 Alt+Enter 菜单,或者在字符串文字前添加以下注释:/*language=html|regexp*/。
当您在编辑器中输入(、[、"或'时,会自动插入成对的字符(如适用)。 此功能很容易关闭,不过您不必担心会错误地插入过多的右小括号、中括号或引号:如果右括号或引号已经存在,ReSharper将不会添加第二个。在XML中,在您输入左引号或中括号时,右符号将自动出现。
在编辑器中将脱字符号放置在任意行上(或者,分别选择块),然后按Ctrl+D,可以快速地复制此代码行(块)。
借助ReSharper,您可以通过按以下四个键快速更改代码元素的顺序:Ctrl+Shift+Alt+Up/Down/Left/Right。 特别是,您可以将成员上下移动,重新排列参数,在块内移动语句,将语句移出或移入块,将XML标记上下移动,将XML特性左右移动,等等。
在编辑器中选择任何代码块并按Ctrl+Alt+/(适用于行注释)或Ctrl+Shift+/(适用于块注释)可以立即注释或取消注释该代码块。
如果未选择代码块,您还可以使用Ctrl+Alt+/快速注释或取消注释编辑器中脱字符号所在位置的代码行。 在同样的情况下,按Ctrl+Shift+/会立即在脱字符号位置前后插入左块注释(/*)和右块注释(*/),如果脱字符号位于注释的代码块中,则会将它们移除。
Extend Selection功能可以帮助您连续选择扩大的代码块。 也就是说,您可以通过将脱字符号放置在代码中的某个位置,然后按几次Ctrl+Alt+Right,轻松地选择代码中的任何表达式。 Shrink Selection正好相反,可以通过按Ctrl+Alt+Left应用。
您也可以按Ctrl+Shift+[,快速选择脱字符号所在处的成员,甚至成员的包含类型。
ReSharper通过更高级的功能扩展了Visual Studio的原生代码补全(IntelliSense)。 例如,它可以根据您的输入缩小建议列表,理解lowerCamelHumps缩写,根据类型名称和您的命名风格建议变量与字段名称,以及自动导入选定类型与扩展方法,等等。
Ctrl+Space代码补全可以识别变量与方法、当前可见的类型名称,以及关键字,等等。 在声明标识符时,ReSharper 可以根据您的命名风格自动建议前缀。
ReSharper甚至还能为局部范围内的未解析符号提供补全:即使代码符号未声明,ReSharper也能从它的用法获取已知成员。
ReSharper的所有代码补全功能(包括符号补全支持CamelHumps),也就是说,仅输入大写字符即可补全任何项。
在ASP.NET文件中,ReSharper还为Web控件属性与事件、数据源、内容占位符以及内联C#代码提供了代码补全。
对于XAML,您可以获得资源引用协助,而在生成脚本中,ReSharper可以在当前范围内可用的属性、目标、任务和特性名称方面为您提供帮助。
不过,Ctrl+Space的功能不仅局限于此。 它还可以让您快速添加符号重写、部分方法正文与部分类,实现接口成员和生成属性。 在补全此类项时,ReSharper将生成和插入方法、构造函数和属性等的全文。
ReSharper还提供了一套C#输入辅助功能,这些功能可以在您输入代码时纠正细微的输入错误。
例如,如果您偶然间输入MethodName(.),此代码将被替换为MethodName().,这就让您可以继续输入调用链,而不必处理无效语法错误。
同样,ReSharper会在逐字字符串内插中将错误输入的@$前缀替换为$@。
ReSharper提供了一组功能,这组功能在应用于项目或整个解决方案时十分有用,与单独的编码帮助程序不同。
这些功能包括ReSharper Build(可以优化MSBuild编译您的项目的方式);关系图(显示项目或类型之间的依赖关系,并作为查找实现这些依赖关系的特定代码的一种方式);重构(用于优化您的解决方案项目中的引用),以及许多其他功能。
借助Run configurations,ReSharper提供了在Visual Studio中执行代码的新方式。 共有三种运行配置:
(1)Project - 借助这种配置类型,您可以在解决方案中运行或调试任何可执行项目。 对于具有多个可执行项目的大型解决方案,此选项十分有用。
(2)Static method - 借助此配置类型,您可以运行或调试没有参数的任何公共静态方法。 需要调试单独调试麻烦的算法? 只需创建一个静态方法,并设置运行配置。
(3)Executable - 使用这种配置类型,您可以运行或调试任何可执行文件。 如果您选择调试命令,ReSharper将运行可执行对象并让Visual Studio连接到其进程。 此配置类型一个比较好的用例是为其他程序开发插件,在这种情况下,您需要创建一个复杂的执行设置。
您也可以在不创建永久运行配置的情况下执行静态方法:只需按Alt+Enter,并使用操作列表中的Debug子菜单。
要运行或调试有效配置(默认状态下时Visual Studio启动项目),请按Ctrl+F5或F5。 要管理运行配置,请按Ctrl+Shift+Alt+R,或者在菜单中选择ReSharper | Tools | Run Configurations。
ReSharper让您能够以可视化方式研究类型如何在您的解决方案中彼此依赖。 在类型依赖关系图中,您可以从不同的项目或编译的程序集添加任意数量的类型,并在它们之间可视化不同的依赖关系。 除了ReSharper | Architecture | Show Type Dependency Diagram这个主菜单命令外,还有多种向关系图添加类型的方式:您可以从Find Results或Hierarchy窗口、显示导航结果的弹出窗口、项目依赖关系图添加所有类型,以及从其他工具窗口添加拖放类型,等等。
与项目依赖关系图类似,类型依赖关系图也提供了许多导航操作,例如 Move to Folder 重构,这种重构可与这里的拖放搭配使用。
借助Find Dependent Code,您可以找依赖于选定项目的代码。 Find Referenced Code则截然相反,借助此功能,您可以查找特定范围(可以小至一个方法,也可以大到一个项目)内遇到的任何外向引用。
两种功能的搜索结构都显示在 Find Results 窗口中,如果找到一个用法,脱字符号将移动到相应的位置。
要查找依赖性或引用的代码,请在Solution Explorer中选择一个节点,或者将脱字符号放置在文本编辑器中的容器处,然后选择ReSharper | Find | Find Code Dependent on Module或ReSharper | Find | Find Symbols External to Scope。
对于在Solution Explorer中管理节点的状态,ReSharper可为Visual Studio提供帮助。 当您在Solution Explorer中折叠项目或另一个高级节点时,普通Visual Studio不会折叠它的包含节点。 因此,当您在之后的某个时间展开项目时,您会发现它会显示一个零星展开的结构。
借助ReSharper,您只需右键点击Solution Explorer节点,并在上下文菜单中选择Collapse All - 选定节点及其所有子节点都会折叠。
Collapse All 可以完美搭配 ReSharper 的另一个简洁的小功能 - Locate in Solution Explorer。 例如,您可以折叠一个项目,然后继续使用Locate in Solution Explorer展开您确实需要的节点。
借助这个方便的导航功能(可以通过Shift+Alt+L调用),您可以在Solution Explorer中为文本编辑器中当前打开的任何文件高亮显示相应的代码。 ReSharper将高亮显示代码并自动滚动Solution Explorer,让您可以实际看到高亮显示的代码。
如果您有一个包含数万个文件的大型解决方案,或者屏幕区域有限,让您不得不尽可能缩小Solution Explorer窗口,此功能将非常有用。 另外,此功能还可与Collapse All in Solution Explorer很好地搭配使用。
ReSharper的代码生成操作可以为您创建许多代码:初始化任意一组类型成员的构造函数;您要实现的接口所需的方法和属性;相等检查、格式化成员,等等。
1、根据用法创建
借助ReSharper,您可以使用方法/函数、属性、局部变量或字段,甚至未声明的类。 ReSharper会建议快速修复,以便根据用法生成相应的声明,然后帮助您根据用法上下文智能地调整声明。 例如,如果您根据用法创建方法,ReSharper不仅会创建方法,也会检测它的返回类型及其参数的类型。
2、生成类型成员
使用ReSharper,只需按Alt+Ins即可快速生成不同的类型成员。
3、生成类型构造函数
在Generate弹出菜单中选择Constructor,然后选择字段、自动属性和想要在构造函数中初始化的基构造函数。 以这种方式创建构造函数只需点击几下。
4、实现/重写方法
为实现接口/重写继承的成员函数创建存根。 提供要实现/重写的可用方法列表时;会生成合适的存根。 按照提示选择多个方法可以生成多个存根。 可以自动完成重写的属性。
5、生成委托成员
委托成员提供了一种方法,可以封装某个行为或通过类的自有接口发布类的字段的方法。 指定字段和它们的方法,ReSharper会在当前类中生成包装方法。
6、生成属性
首先,在Generate菜单中选择Read-only properties或Properties。 然后,对话框中出现提示时,选择一个或多个字段。 完成。 或者,您也可以将新的属性设置为虚拟,或从字段声明中复制XML文档。
7、生成格式化成员
在任何类中,您都可以快速地生成ToString()重写,返回包含任意数量的类型字段或自动属性的格式字符串。
8、生成相等成员
为当前类型快速生成Equals()和GetHashCode()方法。 ReSharper不仅能创建方法,还能生成必要的代码,用于相等检查和/或计算哈希代码。 而且,ReSharper可以生成相等和不相等运算符,或强类型的IEquatable<T>接口。
9、配置代码生成选项
您可以采用多种方法控制生成新成员的方式。
首先,您可以为不同成员配置自定义命名样式。 如果已经存在某种命名样式,ReSharper会在生成新成员时强制执行它的要求。
其余的选项可以在ReSharper | Options | Code Editing | Members Generation中配置。 例如,您可以为生成成员的默认正文内容选项其中一个选项:NotImplementedException(),它会返回默认值和不可编译代码。
ReSharper提供多种代码模板,它们可以帮助您快速编写代码结构,以封闭块包围现有代码,或者创建新文件。 您可以创建特定于自己的编码习惯或基本代码的模板。
实时模板是ReSharper的更智能版本的Visual Studio代码段。
要应用实时模板,只需输入模板缩写,然后在补全列表中按Tab展开模板。 之后,使用Enter或Tab在模板参数中导航。 (如果您使用Visual Studio的原生代码补全,请按Ctrl+E、L显示可用实时模板的列表,并展开模板。)
与代码段不同,ReSharper可以在相应的模板中从能够使用变量、字段和类型的上下文预测。 大多数情况下,您无需自己输入任何内容。 只需从建议值的列表中选择。 而且,ReSharper 可为 C# 导入 Visual Studio 代码段,并让它们能够用作实时模板。
ReSharper为大多数支持的语言和技术提供了170多个预定义实时模板。 此列表包含多个模板,可用于通过集合迭代,编写断言方法,创建新数组,输出值,编写LINQ查询,生成自动属性,等等。
包围模板可以使用if...else、try...catch或其他代码结构快速包围表达式、单个语句或任意的代码块。 ReSharper会智能地重新格式化代码,调整选择,以及/或者重定位脱字符号,这样,您可以在应用模板后立即继续输入。
要包围一段代码,请选择代码,然后按Ctrl+E、U,这会显示一个包含可用包围模板的专用弹出窗口。 或者,您可以在选择上按Alt+Enter,这会显示上下文菜单,其中包含适用的包围模板与其他功能,例如代码格式化程序和上下文操作。
后缀模板可以帮助您转换已经输入的表达式,无需向后跳转。 例如,您可以使用if、while、lock、using包围当前的表达式,在当前表达式前面添加return、yield return和await,在集合上迭代,生成switch语句,将表达式转换为特定类型,甚至为表达式引入字段或属性。
您可以使用自定义源模板轻松扩展后缀模板的列表,在项目代码中的任何位置都能以扩展方法的形式创建后缀模板。 您能够以使用 JetBrains.Annotations 框架中的 [SourceTemplate] 属性修饰的公开扩展方法形式,为项目的一些特定类型或任何标准类型定义后缀模板。
为了阐明源模板的使用,我们可以创建一个简单的模板,此模板将帮助我们检查double值与Pi的相等性,并将您的脱字符号移动到下一行单元测试。
现在,我们可以在计算结果为double值的任何表达式后面输入点,然后调用创建的模板。
当您在补全列表中选择模板后,表达式会被替换为模板代码,且脱字符号会按模板中所述移动。
您可以创建自己的模板,以及修改ReSharper捆绑的模板。
为了编辑模板,ReSharper提供了Template Editor,此工具会在单独的Visual Studio代码窗格中打开,让您可以在代码和模板编辑环境之间切换,并能更快速地完成模板的实际测试。
您可以使用Templates Explorer管理模板 - 选择ReSharper | Tools | Templates Explorer可以调用此窗口。
定义后,使用Templates Explorer能够以两种方法轻松在团队成员之间共享任何模板。
与团队成员共享模板的另一种方法是将设置层的机制用作 ReSharper 设置中保存的代码模板。 为了让使用同一共享解决方案的其他开发者能够利用模板,您可以在团队共享的设置层中创建新代码模板,或者将现有模板复制到团队共享的设置层。
ReSharper可以帮助您确保基本代码中的代码样式一致。 默认的样式设置基于广泛接受的约定和最佳实践;不过如果您的个人偏好或公司标准不同,您也可以全局或按解决方案配置它们,并在您的团队中共享设置。
ReSharper 在代码补全中建议符号名称、生成新成员、应用代码模板和执行重构时,也会考虑您的代码样式偏好设置。
可以通过代码检查检测出代码样式的冲突,并使用快速修复或代码清理来修复它们。
1、代码清理
代码清理是一个功能,可以帮助您立即清除一个或多个文件、项目或整个解决方案中的代码样式冲突,只需一个快捷键:Ctrl+E、C。
两个默认配置文件 - Full Cleanup(应用所有代码样式设置,除了命名样式)和 Reformat Code(仅应用您的格式化规则)- 可以由您的自定义特定任务的配置文件补全。
2、代码格式化
ReSharper可以根据您的偏好设置重新格式化随意选定的代码块,当前文件、目录中所有文件甚至整个项目或解决方案内的所有代码。 ReSharper为所有支持的语言提供独特的格式化选项。 重新格式化会影响大括号布局、空行、自动换行和换行、不同上下文中的空格、缩进、对齐多个结构和其他许多选项,您可以在ReSharper Options对话框中微调它们。
在想要重新格式化的选定代码范围内按Alt+Enter,可以根据上下文配置格式化规则。 在操作列表中选择Format Selection | Configure,以查看会影响代码的所有格式化规则。
3、隐式/显式类型
使用C# 3.0中引入的隐式类型局部变量(var关键字)已十分流行,因为结果代码的可读性已改进。 默认情况下,ReSharper也建议使用var关键字。
不过,您可以更改偏好设置,选择使用显式类型。
4、使用自动属性
自动实现的属性(也称为自动属性)允许以一种简单的方式声明不包含其他逻辑的类型属性。 默认情况下,ReSharper建议使用自动属性(如果可能),不过可以配置此行为。
您可以通过快速修复或代码清理将包含支持字段的属性转换为自动属性。
5、C#修饰符的样式
各种类型和类型成员的C#修饰符可以按任何顺序编写。 不过,最好在您的代码中以相似的方法排列它们,这样可以改进代码可读性。 ReSharper可以帮助您定义所需顺序,查找未排序的修饰符,并自动对它们排序。
另外,ReSharper还会帮助您强制执行明确地使用或不使用private和internal修饰符的偏好设置。
通常,为一些字段使用readonly修饰符是比较合理的,它们是在声明或构造函数中赋值且仅包含读取用法的字段。 默认情况下,如果满足上面的条件,ReSharper会建议您将字段设为只读。
修饰符的所有偏好设置均可配置,您可以使用快速修复和代码清理应用它们。
6、移除代码冗余(仅限C#)
ReSharper 能够为冗余代码提供许多代码检查。
可以使用范围内修复或代码清理来清理大量的冗余,而无需用户交互。
移除代码冗余时,ReSharper会考虑所有其他的代码样式设置。 如果特定代码结构由代码样式设置定义为非冗余,它们将被完整保留。
7、命名样式
ReSharper让您可以为不同语言和符号定义自定义命名样式,符号包括类型、命名空间、接口、参数、方法属性与事件、静态与实例字段,等等。
对于每种符号,您都可以配置五个大小写选项、前缀与后缀、不同访问权限的变体、要保留的缩写和其他选项。
所有的命名样式冲突都会在编辑器中高亮显示,而且可以轻松修复。
此外,您还可以使用 Find Code Issues 功能,在 Inspection Results 窗口中浏览(和快速修复)整个解决方案(或者更小的范围)中的所有命名样式冲突。
8、命名空间导入样式
为了使代码更易读,您可以移除冗余using指令和/或缩短C#和VB.NET代码文件中的限定引用。 而且,有不同的方法导入命名空间 — 您可以添加using/import指令或使用完全限定的类型名称,您可以将指令放置于文件顶部或命名空间内,等等。
使用 ReSharper,您可以直接在编辑器中快速检测和移除冗余导入,或者使用代码清理,这样还可以帮助您按照字母顺序对所需的指令排序并将它们包围在一个区域内。
9、内置C#类型的引用样式
对于内置C#类型,C#类型关键字和.NET框架(CLR)类型名称可以互换。 如果您更愿意为内置类型名称使用一个或另一个样式,ReSharper可以帮助您维护偏好设置。
10、C#特性的样式
C#中的多个特性能以不同的方式编写:您可以将几个特性放置于同一个括号中,或者为不同特性使用几个部分。 ReSharper允许您为多个特性指定样式并在所需范围内强制执行此样式:
ReSharper 还为特性提供了多个格式化规则,并允许利用代码清理以批处理模式为特性应用所有样式偏好设置。
11、可选成员限定符的样式
在C#中,您可以使用this关键字限定实例成员,使用类型名称或基类型名称限定静态成员。 这些限定符会帮助您区分被局部变量或方法参数隐藏的成员。 在所有其他情况下,这些修饰符均为可选,您可以自行决定是否使用它们。 默认情况下,ReSharper会将所有可选成员限定符视为冗余,并建议移除它们。
如果您想要使用可选限定符,可以配置相应的代码样式设置。 例如,您可能想要使用声明静态方法处的类型来限定静态方法。
12、可选括号的样式
在许多情况下,可以不在表达式中使用括号。 有时,括号可以帮助您阐明运算优先级(例如 if ((a & b) | c));不过,它们有时不会有任何好处,只会增加无用代码(例如 var d = a + (b + c);)。 ReSharper 会帮助您定义哪里的可选括号对您有帮助,然后清理冗余括号,或者为不明显的运算优先级自动添加阐明括号。
13、文件和类型布局(仅限C#)
在C#代码中,ReSharper可以自动重新排列代码中的文件和成员。 会根据成员的种类和访问修饰符 将它们排序、分组和包围到指定区域,等等。 ReSharper提供了两种默认布局模式(一组重新排列规则)和智能可视化编辑器。
ReSharper通过内联调试修饰和可搜索的DataTips简化了C#、VB.NET和C++中的调试体验,并为所有支持的语言提供了许多断点导航功能。 除此以外,ReSharper还可以帮助您调试任何外部模块,甚至那些不包含调试信息的模块。
1、内联调试修饰
如果您在调试代码时暂停执行,可以在相应代码行旁查看局部变量的值、当前行表达式,以及直接在编辑器中返回的函数。
ReSharper可以理解[DebuggerDisplayAttribute],这意味着,使用此特性标记的类型、属性和字段的值会在编辑器修饰中相应地显示。
2、改进的可搜索DataTips
ReSharper为Visual Studio DataTips提供了一个经过改进的替代:
(1)您可以通过在DataTip中输入的方式,在当前的暂停执行上下文中搜索特定值。
(2)如果某个类型既没有有意义的ToString()重写,也没有使用[DebuggerDisplayAttribute]注释,则此类型对象在(3)调试器视图中的表示将不提供任何信息。 在ReSharper DataTips中,您可以随时自定义此类对象的表示。
(4)ReSharper DataTips不会在您移除鼠标指针时消失,它们仍然存在,直至您按Esc键或点击DataTip外的任何地方。
3、Go to Breakpoints
借助ReSharper,您可以按Ctrl+Alt+F9(ReSharper | Navigate | Breakpoints),快速跳到解决方案中的任何断点/跟踪点。
在最初包含解决方案中所有断点的列表中,您可以输入内容,按上下文筛选结果,然后直接导航到所需断点。
您还可以直接在列表中按Delete键,移除断点。
4、ReSharper断点窗口
ReSharper拥有自己的R# Breakpoints窗口,您可以将其作为原生Visual Studio窗口的替代。 在ReSharper的窗口中,您可以:
(1)按文件/文件夹/项目/类型/成员将断点分组,
(2)在窗口中输入内容,按上下文搜索断点,
(3)使用上下文菜单启用/禁用或移除断点,
(4)预览设置选定断点处的代码,
(5)将断点导出至文本、XML或HTML文件。
您还可以在Find Results窗口中查看、切换和启用/禁用断点,此功能非常方便 - 例如,您可以快速地为将要调试的符号的所有实例设置断点。
5、没有调试信息(PDB)的调试模块
借助ReSharper,您可以调试任何已编译的模块,即使该模块没有调试信息(PDB)。 ReSharper将反编译模块,为其生成PDB,并自动将此模块的反编译符号加载到Visual Studio调试器中。
ReSharper提供了一个单元测试运行程序,这个测试运行程序可以帮助您基于NUnit、xUnit.net、MSTest、QUnit和Jasmine运行及调试单元测试。 您可以浏览测试,按照不同的方式为测试分组,将测试细分为各个会话,查看测试输出以及从堆栈跟踪导航到源代码。
利用ReSharper Ultimate,您还可以连续运行测试,衡量测试覆盖率和性能。
1、运行和调试单元测试
ReSharper 可以自动检测您的 .NET 和 .NET Core 项目中 NUnit、XUnit 和 MSTest 框架的单元测试。 MSpec等其他单元测试框架通过ReSharper插件获得支持。
ReSharper在测试类声明和单个测试旁添加了特殊图标,您可以点击这些图标来运行或调试测试。 或者,当脱字符号位于测试声明中时,按Alt+Enter。
还可以通过上下文菜单执行测试。 此外,您还可以在Visual Studio的Solution Explorer中运行或调试任意数量的单元测试组。 只需选择一个文件、文件夹、项目或解决方案,并按Ctrl+U、R或Ctrl+U、D;或者右键点击所选项,并选择Run unit tests或Debug unit tests。
2、Unit Test Explorer
ReSharper提供了Unit Test Explorer — 一个结构化的单元测试列表,用于查看整个解决方案中测试的结构。 此树可以使用Ctrl+Alt+U快捷键或通过ReSharper | Windows菜单调用,会在您生成项目后快速填充。 利用Unit Test Explorer,您可以在一个或多个单元测试会话中运行任何测试组合。
3、Unit Test Sessions
ReSharper在Unit Test Sessions窗口中运行单元测试。 此窗口旨在帮助您同时并彼此独立地运行任意数量的单元测试会话。 这些会话可以包括任意测试组合。 在调试模式中,一次只能运行一个会话。
单元测试树可以显示属于某个会话的测试的结构,您可以筛选,只显示通过、失败或忽略的单元测试。 您可以通过双击导航到任意单元测试的代码。
进度栏和状态栏可以显示当前的进度。 您可以随时停止、运行或者重新生成并重新运行单元测试。
借助Preview窗格,您可以分析测试结果,并从失败测试的输出导航到引发异常的代码行,点击一下即可完成操作。
4、使用dotCover分析代码覆盖率
利用 JetBrains dotCover(ReSharper Ultimate 许可证同样提供此工具),您可以轻松发现单元测试对您的解决方案代码的覆盖程度。
安装dotCover后,它将根据选定范围对单元测试的代码覆盖率进行分析和可视化,并显示单元测试未覆盖的代码。 这对于在应用程序开发和质量保证中设置正确的优先级十分有帮助。
5、使用dotCover进行连续测试
如果您使用 ReSharper Ultimate 或 dotCover,可以享用连续测试:一个现代的单元测试工作流,在这个流程中,dotCover 可以实时发现哪些单元测试受到最新代码更改的影响,并自动为您重新运行受影响的测试。
dotCover可以在保存文件、生成解决方案时,或者当您明确要求dotCover执行相关操作时检测和/或运行受影响的测试。
您可以针对所有单元测试使用连续测试,也可以指定希望连续运行哪些测试以及以传统方式运行哪些测试。
6、使用dotTrace分析单元测试的性能
您还可以通过 JetBrains dotTrace 在 Visual Studio 中快速分析单元测试的性能,dotTrace 是一款强大的 .NET 性能分析工具,也是 ReSharper Ultimate 的一部分。
安装dotTrace后,您可以使用ReSharper为测试类和各个测试添加的侧栏标记,直接从编辑器中开始性能分析。
7、使用dotMemory Unit监控内存使用
要直接在单元测试中分析内存使用率,可以使用 dotMemory Unit,这是 JetBrains 推出的一款免费内存单元测试框架。
在引用dotMemory Unit后,您可以根据内存流量、特定对象是否存在于内存中以及指示应用程序内存使用率的其他因素来让您的单元测试通过或失败。
对于.NET开发者来说,国际化一直都是一个多余的障碍,因为这涉及将字符串提取到资源文件中以及在许多不同的文化之间维护资源项集合,非常麻烦。
借助针对resx文件和C#与VB.NET代码以及ASP.NET和XAML标记中资源用法的重构、导航、代码检查和快速修复,ReSharper可以节省花在国际化上的时间。
1、高亮显示可以本地化的字符串
ReSharper 能够检测您可以本地化的字符串,高亮显示这些字符串,并帮助您将其移动到资源文件中。
根据您的项目设置的不同,ReSharper可以高亮显示所有硬编码字符串文字,或者仅高亮显示那些使用Localizable(true)显式标记的字符串文字。
2、将字符串移动到资源文件中
在ReSharper发现可以本地化的字符串后,它会尽快帮助您将其移动到资源文件中。 您可以选择搜索相同的字符串,并对它们进行重构以使用新的资源项。
根据您的项目设置的不同,您可以移动到资源文件中的字符串可能会使用波浪下划线高亮显示,也可能不会。 如果字符串未高亮显示,请按Ctrl+Shift+R并选择Move to Resource重构。 如果字符串使用波浪下划线高亮显示(如上面的屏幕截图中所示),您可以按 Alt+Enter,并直接从快速修复的列表中启动重构。
除了C#或VB.NET代码中使用的字符串之外,ReSharper还能处理Web应用程序的标记文件中的字符串和任意的HTML字符串。
3、重构
除了将字符串移动到资源文件中之外,ReSharper还提供了许多其他国际化重构:
(1)Move Resource重构可以在资源文件之间移动现有的资源条目。
(2)Rename Resource可以帮助您在资源条目中更改name特性的值。
(3)Inline Resource可以将某个资源条目从资源文件中删除,并将它的所有用法替换为原始字符串。
(4)Safe Delete Resource会尝试删除某个资源条目及其所有的用法,而不破坏代码。 如果Resharper发现某些用法无法安全地自动删除,它会建议您先手动编辑这些用法,然后再应用重构。
4、资源文件中的代码检查
ReSharper 提供了多个代码检查,这些代码检查可以帮助显示资源条目的常见问题。
具体来讲,如果特定资源值在某个文化中未被重写,或者使用与文化中立的资源文件中的相同名称重写,ReSharper都会向您发出警告。 ReSharper会告知您单个资源文件中的重复资源名称,它甚至能够检测资源值中缺失或冗余的格式字符串占位符。
在检测到此类问题时,ReSharper会在文本编辑中高亮显示。 此外,您还可以使用 ReSharper 的 Find Code Issues 功能浏览(并导航到)资源文件中的所有问题。
最后,ReSharper 还提供了快速修复,您可以使用这些快速修复快速解决资源文件中的问题。
5、查找资源的用法
ReSharper 的 Find Usages 功能非常适合资源。 您可以从代码和资源文件中搜索某个资源条目的实例。
6、在文化和资源之间导航
ReSharper 的 Go to Derived Symbols 和 Go to Base 功能可以帮助您从文化中立的资源文件中的资源条目导航到文化特定的资源文件中的对应条目,反之亦然。
7、资源文件结构
ReSharper 为查看资源文件的结构提供了专用版本的 File Structure 工具窗口。 它可以列出资源文件中的所有条目,可视化资源ID、当前文化中的资源文本和资源注释(如有)。 此外,此工具窗口还可以指定资源条目在其他文化中是否重写,以及它们是否包含格式占位符。
ReSharper可以使用一整套代码分析、编码辅助、导航与代码生成功能帮助您高效地处理ASP.NET和ASP.NET MVC项目,包括标记文件。 其中一些功能在Web应用程序中的运行方式与它们在C#或VB.NET项目中的运行方式完全一样,其他功能则针对Web开发的特定要求进行了优化。
ReSharper 的导航功能包中的大多数功能都可以在 ASP.NET 中使用。
例如,如果您想概括了解当前打开的 aspx 文件中的标记项,请按 Ctrl+Alt+F,显示 File Structure 工具窗口。 您也可以使用文件结构派生,例如 Go to File Member、Go to Next/Previous Member和“Go to Containing Declaration”。
其他可以在 ASP.NET 项目中派上用场的导航操作包括 Go to Declaration(特别适用于从引用导航到用户控件和主页面)和Go to Usages of Symbol(用于从 ContentPlaceHolder 标记导航到它们的 Content 对应项,或从主页面引用导航到使用它的任何 Web 表单)。
借助ReSharper,只要您处理通用Windows平台(UWP)、WPF、Silverlight或Windows Phone应用程序,就可以获得编辑XAML文件的附加辅助。 这包括实时代码质量分析、重构、代码生成和重新排列,以及快速的解决方案级导航。
ReSharper 的代码质量分析功能可帮助您快速定位并更正 XAML 文件中的错误。 让我们通过几个示例来了解它的工作原理。
示例1. XAML语言级错误
比如,您正在开发一个只允许XAML 2006的WPF项目。 如果ReSharper遇到来自XAML 2009的泛型对象,它会将对象高亮显示为语言错误。 如果您在高亮显示上按Alt+Enter,ReSharper将显示一个快速修复建议,转而声明从System.Collections.Generic.List<string>继承的类型。
在您应用快速修复时,ReSharper:
(1)创建一个新的.cs文件,在该文件中声明一个继承自List的新包装器类型。
(2)在原始XAML文件中,它会删除TypeArguments特性,将对象的类型更改为新的包装器类型,并在必要时插入新的命名空间指令。
示例2. 不存在的资源
如果您正在使用尚未声明的资源,则ReSharper错误高亮显示不会让您忘记这一点。
当您按Alt+Enter时,ReSharper会建议几个可能的位置来创建缺失的资源。
如果尚未声明生成的资源的类型,没关系:ReSharper将为您提供根据用法创建CLR类型或XAML类型(即,UserControl)的选项。 选择两个选项之一会创建一个具有默认实现的文件。
示例3. 错放的注释
在元素中意外放置注释时,ReSharper将高亮显示该注释并提供解决错误的选项。
示例4. 冗余类型限定符
在样式setter上定义TargetType的情况下,ReSharper会检测类型限定符中的冗余并提供修复。
您可以在XAML标记中使用ReSharper的代码补全。 对 CamelHumps 的支持将帮助您快速添加特性:只需输入几个符号并按 Ctrl+Space 即可显示 ReSharper 的符号补全提供的相关建议列表。
如果您通过按 Ctrl+Alt+Space 调用智能补全,ReSharper 将根据您在代码中的位置提供其他可感知上下文的选项。 例如,在事件处理程序声明中调用智能补全将生成处理程序方法。
通过在特性中使用智能补全,您可以快速创建新资源(静态或动态)、绑定或对静态元素的引用。
ReSharper代码补全的另一个振奋人心的优势是,它显示了在Background或OpacityMask等特性中预期的画笔颜色。
ReSharper 还支持 XAML 中的导入符号补全。 这意味着,您可以从在您的解决方案中引用,但在当前文件中没有相应的命名空间导入指令的程序集补全类型。
当然,一旦您以这种方式使用ReSharper代码补全,将自动插入所需的命名空间导入指令。
或者,如果您在某个XAML文件中有一个由于某种原因未导入的类型,ReSharper将为您提供快速创建命名空间指令的选项。
ReSharper 的 Navigate To 菜单处理 XAML 代码元素的方式与在 C# 代码文件中的处理方式相同。 在符号声明或用法上按Alt+`可以打开一个包含多个可能的导航目标的菜单。
通过 Go to File Member 在 XAML 文件中导航的方式与在 C# 文件中的方式相同,有助于导航到具有特定类型、名称或键的元素。 同样,您无需输入整个名称 - 对小写CamelHumps的支持让您只输入wl即可查找WatchList。
在 XAML 文件中按 Ctrl+Alt+F7 时,您将获得所有相关文件的列表:例如,代码隐藏文件、当前 XAML 文件中引用的任何资源或控件中使用的图像。
Go to Declaration(F12)和 Ctrl + 点击导航在 XAML 文件中的工作方式与在普通 C# 代码文件中的工作方式相同。 例如,在按住Ctrl的同时,您可以将鼠标悬停在特定类的名称上。 ReSharper将为类名添加下划线,点击该链接将直接转到类定义。
此外,就像代码文件一样,File Structure 窗口显示 XAML 文件的结构,使您可以快速导航到您正在查找的代码元素。
您可以通过按 Shift + F12 查找特定 XAML 元素的用法,此操作将调用 Find Usages 命令。 ReSharper将显示元素的所有使用位置。
由于XAML元素本质上等同于普通的类成员,因此适用于C#的一些重构也适用于XAML。 例如,您只需打开 Refactor This 菜单即可重命名或安全删除资源。
当您在XAML中对属性或方法的引用进行导航时,Refactor This菜单中显示的重构范围与您在C#或VB.NET代码中打开该菜单时的期望一致。
除了C#和VB.NET重构之外,还有一些特定于XAML的重构:
在XAML中,为多个控件定义内联样式,然后将它们重定位到样式定义是一种常见情况。 通过Extract Style重构,ReSharper使这项操作变得轻而易举。
为此重构显示的对话框可帮助您确定将属性提取到哪个资源(您可以选择现有资源或创建新资源),以及要提取哪些属性。
Extract Resource和Inline Resource重构允许您将几乎任何属性赋值(包括标记扩展中的属性赋值)移动到资源,反之亦然 - 从资源中获取定义并将其拼接到元素中。
在您创建或维护生成脚本时,ReSharper可以通过XML支持和生成脚本特定的功能(例如代码补全、代码检查和快速修复)为您提供帮助。