本主题中的部分列出了适用于 C# 和 Visual Basic 代码的一些常见 快速作 。 这些作是编译器诊断 的代码修复 ,或者是 Visual Studio 中的内置 .NET 编译器平台分析器 。
修复错误的作
本部分中的“快速作”修复了导致生成失败的代码中的错误。 当快速作可用于修复代码行上的错误时,在边距或红色波浪线下方显示的图标是一个灯泡,其上带有红色“x”。
更正拼写错误的符号或关键字
如果在 Visual Studio 中意外错失类型或关键字,此快速作会自动更正它。 你将在灯泡菜单中看到这些项,显示为“将”<拼写错误的单词>“更改为”<正确单词>”。 例如:
// Before
private viod MyMethod()
{
}
// Change 'viod' to 'void'
// After
private void MyMethod()
{
}
| 错误 ID | 适用的语言 |
|---|---|
| CS0103、BC30002 | C# 和 Visual Basic |
解决 git 合并冲突
通过这些快速作,可以通过“进行更改”来解决 git 合并冲突,从而删除冲突的代码和标记。
// Before
private void MyMethod()
{
if (false)
{
}
}
// Take changes from 'HEAD'
// After
private void MyMethod()
{
if (true)
{
}
}
| 错误 ID | 适用的语言 | 支持版本 |
|---|---|---|
| CS8300、BC37284 | C# 和 Visual Basic | Visual Studio 2017 版本 15.3 及更高版本 |
删除不必要的代码的作
删除不必要的 usings/Imports
删除不必要的 Usings/Imports 快速作将删除当前文件的任何未使用using和Import指令。 选择此项时,将删除未使用的命名空间导入。
删除不必要的 cast
如果将类型强制转换为不需要强制转换的另一种类型, 则“删除不必要的强制转换 快速作”项将删除不必要的强制转换。
删除未使用的变量
通过此快速作,可以删除已声明但从未在代码中使用的变量。
// Before
public MyMethod()
{
var unused = 8;
var used = 1;
return DoStuff(used);
}
// Remove unused variables
// After
public MyMethod()
{
var used = 1;
return DoStuff(used);
}
| 诊断标识符 | 适用的语言 | 支持版本 |
|---|---|---|
| CS0219、BC42024 | C# 和 Visual Basic | Visual Studio 2017 版本 15.3 及更高版本 |
从默认值表达式中删除类型
此快速作从默认值表达式中删除值类型,并在编译器可以推断表达式的类型时使用 默认文本 。
// Before
void DoWork(CancellationToken cancellationToken = default(CancellationToken)) { ... }
// Simplify default expression
// After
void DoWork(CancellationToken cancellationToken = default) { ... }
| 诊断标识符 | 适用的语言 | 支持版本 |
|---|---|---|
| IDE0034 | C# 7.1+ | Visual Studio 2017 版本 15.3 及更高版本 |
添加缺失代码的作
为引用程序集、NuGet 包或解决方案中的其他类型的类型添加 usings/imports
使用解决方案中其他项目中的类型将自动显示快速作,但需要从 “工具 > 选项 > 文本编辑器 > C# ”或 “Visual Basic > 高级 ”选项卡启用其他类型:
- 建议对引用程序集中的类型使用/导入
- 建议对 NuGet 包中的类型使用/导入
启用后,如果在当前未导入但存在于引用程序集或 NuGet 包中的命名空间中使用类型,则会创建 using 或 import 指令。
// Before
Debug.WriteLine("Hello");
// using System.Diagnostics;
// After
using System.Diagnostics;
Debug.WriteLine("Hello");
| 诊断标识符 | 适用的语言 |
|---|---|
| CS0103、BC30451 | C# 和 Visual Basic |
添加缺失事例/默认大小写/两者
switch在 C# 或 Select Case Visual Basic 中创建语句时,可以使用代码作自动添加缺失事例项、默认 case 语句或两者。
请考虑以下枚举和空 switch 或 Select Case 语句:
在缺少的情况下使用 “添加两 个快速作”填充并添加默认事例:
switch(myEnum)
{
case MyEnum.Item1:
break;
case MyEnum.Item2:
break;
case MyEnum.Item3:
break;
default:
break;
}
| 诊断标识符 | 适用的语言 | 支持版本 |
|---|---|---|
| IDE0010 | C# 和 Visual Basic | Visual 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 Basic | Visual 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 Basic | Visual Studio 2017 版本 15.3 及更高版本 |
添加大括号
添加大括号快速作将大括号环绕单行 if 语句。
// Before
if (true)
return "hello,world";
// Add braces
// After
if (true)
{
return "hello,world";
}
| 诊断标识符 | 适用的语言 | 支持版本 |
|---|---|---|
| IDE0011 | C# | Visual Studio 2017 及更高版本 |
添加和订购修饰符
这些快速作通过使你能够对现有修饰符进行排序并添加缺少的辅助功能修饰符来帮助组织修饰符。
// Before
enum Color
{
Red, White, Blue
}
// Add accessibility modifiers
// After
internal enum Color
{
Red, White, Blue
}
// Before
static private int thisFieldIsPublic;
// Order modifiers
// After
private static int thisFieldIsPublic;
| 诊断标识符 | 适用的语言 | 支持版本 |
|---|---|---|
| IDE0036 | C# 和 Visual Basic | Visual Studio 2017 版本 15.5 及更高版本 |
| IDE0040 | C# 和 Visual Basic | Visual 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 Basic | Visual 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 };
| 诊断标识符 | 适用的语言 | 支持版本 |
|---|---|---|
| IDE0017 | C# 和 Visual Basic | Visual Studio 2017 及更高版本 |
使用集合初始值设定项
通过此快速作,可以使用 集合初始值设定项 ,而不是对类方法的多个调用 Add 。
// Before
var list = new List<int>();
list.Add(1);
list.Add(2);
list.Add(3);
// Collection initialization can be simplified
// After
var list = new List<int> { 1, 2, 3 };
| 诊断标识符 | 适用的语言 | 支持版本 |
|---|---|---|
| IDE0028 | C# 和 Visual Basic | Visual Studio 2017 及更高版本 |
将 auto 属性转换为完整属性
通过此快速作,可以将自动属性转换为完整属性,反之亦然。
// Before
private int MyProperty { get; set; }
// Convert to full property
// After
private int MyProperty
{
get { return _myProperty; }
set { _myProperty = value; }
}
| 适用的语言 | 支持版本 |
|---|---|
| C# 和 Visual Basic | Visual Studio 2017 版本 15.5 及更高版本 |
将块正文转换为 expression-bodied 成员
通过此快速作,可以将块体转换为方法、构造函数、运算符、属性、索引器和访问器的表达式主体成员。
//Before
class MyClass4
{
private int _myProperty;
public int MyProperty
{
get { return _myProperty; }
set
{
_myProperty = value;
}
}
public MyClass4(int myProperty)
{
MyProperty = myProperty;
}
public void PrintProperty()
{
Console.WriteLine(MyProperty);
}
}
// Use expression body for accessors/constructors/methods
// After
class MyClass4
{
private int _myProperty;
public int MyProperty
{
get => _myProperty;
set => _myProperty = value;
}
public MyClass4(int myProperty) => MyProperty = myProperty;
public void PrintProperty() => Console.WriteLine(MyProperty);
}
| 诊断标识符 | 适用的语言 | 支持版本 |
|---|---|---|
| IDE0021-27 | C# 6.0+ | Visual Studio 2017 及更高版本 |
将匿名函数转换为本地函数
此快速作将匿名函数转换为本地函数。
// Before
Func<int, int> fibonacci = null;
fibonacci = (int n) =>
{
return n <= 1 ? 1 : fibonacci(n - 1) + fibonacci(n - 2);
};
// Use local function
// After
int fibonacci(int n)
{
return n <= 1 ? 1 : fibonacci(n-1) + fibonacci(n-2);
}
将“ReferenceEquals”转换为“is null”
| 诊断标识符 | 适用的语言 | 支持版本 |
|---|---|---|
| IDE0041 | C# 7.0+ | Visual Studio 2017 版本 15.5 及更高版本 |
此快速作建议尽可能使用 模式匹配 ,而不是 ReferenceEquals 编码模式。
// Before
var value = "someString";
if (object.ReferenceEquals(value, null))
{
return;
}
// Use 'is null' check
// After
var value = "someString";
if (value is null)
{
return;
}
| 诊断标识符 | 适用的语言 | 支持版本 |
|---|---|---|
| IDE0039 | C# 7.0+ | Visual Studio 2017 版本 15。 及更高版本 |
引入模式匹配
此快速作建议在 C# 中使用 模式匹配 和强制转换和 null 检查。
// Before
if (o is int)
{
var i = (int)o;
...
}
// Use pattern matching
// After
if (o is int i)
{
...
}
// Before
var s = o as string;
if (s != null)
{
...
}
// Use pattern matching
// After
if (o is string s)
{
...
}
| 诊断标识符 | 适用的语言 | 支持版本 |
|---|---|---|
| IDE0020 | C# 7.0+ | Visual Studio 2017 及更高版本 |
| IDE0019 | C# 7.0+ | Visual Studio 2017 及更高版本 |
更改数字文本的基数
通过此快速作,可以将数字文本从一个基数值系统转换为另一个。 例如,可以将数字更改为十六进制或二进制格式。
| 适用的语言 | 支持版本 |
|---|---|
| C# 7.0+ 和 Visual Basic 14+ | Visual Studio 2017 版本 15.3 及更高版本 |
将数字分隔符插入文本
通过此快速作,可以将分隔符添加到文本值中。
| 适用的语言 | 支持版本 |
|---|---|
| C# 7.0+ 和 Visual Basic 14+ | Visual Studio 2017 版本 15.3 及更高版本 |
使用显式元组名称
此快速作标识可以使用显式元组名称的区域,而不是 Item1、Item2 等。
// Before
(string name, int age) customer = GetCustomer();
var name = customer.Item1;
// Use explicit tuple name
// After
(string name, int age) customer = GetCustomer();
var name = customer.name;
| 诊断标识符 | 适用的语言 | 支持版本 |
|---|---|---|
| IDE0033 | C# 7.0+ 和 Visual Basic 15+ | Visual Studio 2017 及更高版本 |
使用推断的名称
此快速作指出,何时可以简化代码以在匿名类型中使用推断成员名称,或者在元组中使用推断的元素名称。
// Before
var anon = new { age = age, name = name };
// Use inferred member name
// After
var anon = new { age, name };
// Before
var tuple = (age: age, name: name);
// Use inferred tuple element name
// After
var tuple = (age, name);
| 诊断标识符 | 适用的语言 | 支持版本 |
|---|---|---|
| IDE0037 | C# | Visual Studio 2017 版本 15.5 及更高版本 |
| IDE0037 | C# 7.1+ | Visual Studio 2017 版本 15.5 及更高版本 |
析构元组声明
此快速作启用解构元组变量声明。
// Before
var person = GetPersonTuple();
Console.WriteLine($"{person.name} {person.age}");
(int x, int y) point = GetPointTuple();
Console.WriteLine($"{point.x} {point.y}");
//Deconstruct variable declaration
// After
var (name, age) = GetPersonTuple();
Console.WriteLine($"{name} {age}");
(int x, int y) = GetPointTuple();
Console.WriteLine($"{x} {y}");
| 诊断标识符 | 适用的语言 | 支持版本 |
|---|---|---|
| IDE0042 | C# 7.0+ | Visual Studio 2017 版本 15.5 及更高版本 |
使方法同步
在方法上使用 async 或 Async 关键字时,预期该方法中 await 也使用了或 Await 关键字。 但是,如果不是这种情况,则会出现一个快速作,它通过删除 async 或 Async 关键字并更改返回类型使方法同步。 使用“快速作”菜单中的 “Make 方法同步 ”选项。
// Before
async Task<int> MyAsyncMethod()
{
return 3;
}
// Make method synchronous
// After
int MyAsyncMethod()
{
return 3;
}
| 错误 ID | 适用的语言 |
|---|---|
| CS1998、BC42356 | C# 和 Visual Basic |
使方法异步
在方法内使用 await 或 Await 关键字时,预期该方法标有 async 或 Async 关键字。 但是,如果情况并非如此,将显示一个快速作,使该方法异步。 使用“快速作”菜单中的 Make 方法/函数异步 选项。
// Before
int MyAsyncMethod()
{
return await Task.Run(...);
}
// Make method asynchronous
// After
async Task<int> MyAsyncMethod()
{
return await Task.Run(...);
}
| 错误 ID | 适用的语言 | 支持版本 |
|---|---|---|
| CS4032、BC37057 | C# 和 Visual Basic | Visual Studio 2017 及更高版本 |