Visual Studio常见快速操作

此主题的各个部分列出了同时适用于 C# 和 Visual Basic 代码的一些常见“快速操作” 。 这些操作是适用于编译器诊断或 Visual Studio 中的内置 .NET Compiler Platform 分析器的代码修复。

修复错误的操作

本节中的“快速操作”可修复会导致生成失败的代码中的错误。 当“快速操作”可用于修复一行代码中的错误时,边距中或红色波浪线下会显示一个带有红色“x”的灯泡图标。

1.jpg

更正拼写错误的符号或关键字

如果在 Visual Studio 中意外拼错类型或关键字,此“快速操作”会自动更正拼写错误。 灯泡菜单“将‘<拼写错误的单词>’更改为‘<正确单词>’”中会显示这些项。 例如:

// Before
private viod MyMethod()
{
}

// Change 'viod' to 'void'

// After
private void MyMethod()
{
}


错误 ID适用的语言
CS0103、BC30002C# 和 Visual Basic

解决 git 合并冲突

借助这些快速操作,可以通过“接受更改”(即移除冲突的代码和标记)解决 git 合并冲突问题。

// Before
private void MyMethod()
{
    if (false)
    {

    }
}

// Take changes from 'HEAD'

// After
private void MyMethod()
{
    if (true)
    {

    }
}


错误 ID适用的语言支持的版本
CS8300、BC37284C# 和 Visual BasicVisual Studio 2017 版本 15.3 及更高版本

删除不必要代码的操作

删除不必要的 using/Import

“删除不必要的 Using/Import” 快速操作将删除当前文件中任何未使用的 using 和 Import 指令。 选择此项后,将删除未使用的命名空间导入。

删除不必要的 cast

如果你将一种类型强制转换为另一种不需要强制转换的类型,“删除不必要的强制转换” 快速操作可删除不必要的强制转换。

复制
// before
int number = (int)3;

// Remove Unnecessary Cast

// after
int number = 3;

删除未使用的变量

借助此快速操作,可以从代码中删除已声明但从未用过的变量。

// Before
public MyMethod()
{
    var unused = 8;
    var used = 1;
    return DoStuff(used);
}

// Remove unused variables

// After
public MyMethod()
{
    var used = 1;
    return DoStuff(used);
}


诊断 ID适用的语言支持的版本
CS0219、BC42024C# 和 Visual BasicVisual Studio 2017 版本 15.3 及更高版本

从“默认”值表达式中删除类型

此快速操作从默认值表达式中删除值类型,并在编译器可推断出表达式类型时使用 默认文本

// Before
void DoWork(CancellationToken cancellationToken =default(CancellationToken)){...}

// Simplify default expression

// After
void DoWork(CancellationToken cancellationToken = default) {...}


诊断 ID适用的语言支持的版本
IDE0034C# 7.1+Visual Studio 2017 版本 15.3 及更高版本

添加缺失代码的操作

在引用程序集、NuGet 包或解决方案的其他类型中为类型添加 using/import

位于解决方案其他项目中的 using 类型将自动显示快速操作,但其他类型的快速操作则需要从“工具”>“选项”>“文本编辑器”>“C#”或“Visual Basic”>“高级”选项卡中启用:

1、建议对引用程序集中的类型使用 using/import

2、建议对 NuGet 包中的类型使用 using/import

启用后,如果使用当前未导入但引用程序集或 NuGet 包中存在的命名空间中的类型,则会创建 using 或 import 指令。

// Before
Debug.WriteLine("Hello");

// using System.Diagnostics;

// After
using System.Diagnostics;

Debug.WriteLine("Hello");


诊断 ID适用的语言
CS0103、BC30451C# 和 Visual Basic

添加缺少的 case/默认 case/二者

在 C# 中创建 switch 语句,或在 Visual Basic 中创建 Select Case 语句时,可使用代码操作自动添加缺少的 case 项、默认 case 语句或同时添加二者。

请考虑使用以下枚举和空 switch 或 Select Case 语句:

enum MyEnum
{
    Item1,
    Item2,
    Item3
}

...

MyEnum myEnum = MyEnum.Item1;

switch(myEnum)
{
}

使用“添加二者” 快速操作可填充缺少的案例,并添加默认案例:

switch(myEnum)
{
    case MyEnum.Item1:
        break;
    case MyEnum.Item2:
        break;
    case MyEnum.Item3:
        break;
    default:
        break;
}


诊断 ID适用的语言支持的版本
IDE0010C# 和 Visual BasicVisual Studio 2017 版本 15.3 及更高版本

添加 null 参数检查

借助此快速操作,可以在代码中添加检查,从而指明参数是否为 null。

// Before
class MyClass
{
    public string MyProperty { get; set; }

    public MyClass(string myProperty) // cursor inside myProperty
    {
        MyProperty = myProperty;
    }
}

// Add null check

// After
class MyClass
{
    public string MyProperty { get; set; }

    public MyClass(string myProperty)
    {
        MyProperty = myProperty ?? throw new ArgumentNullException(nameof(myProperty));
    }
}


适用的语言支持的版本
C# 和 Visual BasicVisual Studio 2017 版本 15.3 及更高版本

添加参数名称

// Before
var date = new DateTime(1997, 7, 8);

// Include argument name 'year' (include trailing arguments)

// After
var date = new DateTime(year: 1997, month: 7, day: 8);


适用的语言支持的版本
C# 和 Visual BasicVisual Studio 2017 版本 15.3 及更高版本

添加大括号

“添加大括号”快速操作将单行 if 语句包含在大括号内。

// Before
if (true)
    return "hello,world";

// Add braces

// After
if (true)
{
    return "hello,world";
}


诊断 ID适用的语言支持的版本
IDE0011C#Visual Studio 2017 及更高版本

添加修饰符并对其排序

这些快速操作通过对现有辅助功能修饰符排序和添加缺失的辅助功能修饰符来帮助整理修饰符。

// Before
enum Color
{
    Red, White, Blue
}

// Add accessibility modifiers

// After
internal enum Color
{
    Red, White, Blue
}
C#

复制
// Before
static private int thisFieldIsPublic;

// Order modifiers

// After
private static int thisFieldIsPublic;


诊断 ID适用的语言支持的版本
IDE0036C# 和 Visual BasicVisual Studio 2017 版本 15.5 及更高版本
IDE0040C# 和 Visual BasicVisual Studio 2017 版本 15.5 及更高版本

代码转换

将“if”构造转换成“switch”

借助此快速操作,可以将 if-then-else 构造转换成 switch 构造。

// Before
if (obj is string s)
{
  Console.WriteLine("obj is a string: " + s);
}

else if (obj is int i && i > 10)
{
  Console.WriteLine("obj is an int greater than 10");
}

// Convert to switch

// After
switch (obj)
{
  case string s:
    Console.WriteLine("Obj is a string: " + s);
    break;
  case int i when i > 10:
    Console.WriteLine("obj is an int greater than 10");
    break;
}


适用的语言支持的版本
C# 和 Visual BasicVisual Studio 2017 版本 15.3 及更高版本

转换为内插字符串

类似于 String.Format 方法,内插字符串是使用嵌入式变量来表达字符串的一种简单方式。 此快速操作可识别何时需要将字符串连接在一起或使用 String.Format,然后将用法更改为内插字符串。

// Before
int num = 3;
string s = string.Format("My string with {0} in the middle", num);

// Convert to interpolated string

// After
int num = 3;
string s = $"My string with {num} in the middle";


适用的语言支持的版本
C# 6.0+ 和 Visual Basic 14+Visual Studio 2017 及更高版本

使用对象初始值设定项

借助此快速操作,可使用对象初始值设定项,无需调用构造函数并添加赋值语句行。

// Before
var c = new Customer();
c.Age = 21;

// Object initialization can be simplified

// After
var c = new Customer() { Age = 21 };


诊断 ID适用的语言支持的版本
IDE0017C# 和 Visual BasicVisual Studio 2017 及更高版本