Распространенные быстрые действия
В этих разделах статьи перечислены некоторые распространенные быстрые действия, которые применяются как к коду C#, так и к коду Visual Basic. Эти действия являются исправлениями кода для диагностики компилятора или встроенных анализаторов .NET Compiler Platform в Visual Studio.
Действия для исправления ошибок
Описанные в этом разделе быстрые действия исправляют ошибки в коде, которые в противном случае привели бы к сбою сборки. Когда для устранения ошибки в строке кода доступны быстрые действия, значок, отображаемый в поле или под красной волнистой линией, имеет форму лампочки с красным крестом.
Исправление опечаток в символах или ключевых словах
Если вы неправильно вводите тип или ключевое слово в Visual Studio, это быстрое действие автоматически исправляет его. Эти элементы будут отображаться в меню лампочки как "Изменить "<неправильное слово>" на "<правильное слово>". Например:
// Before
private viod MyMethod()
{
}
// Change 'viod' to 'void'
// After
private void MyMethod()
{
}
Идентификатор ошибки | Применимые языки |
---|---|
CS0103, BC30002 | C# и Visual Basic |
Разрешение конфликтов слияния Git
Эти быстрые действия позволяют устранить конфликты слияния Git, "применяя изменения", то есть удаляя конфликтующие маркеры и код.
// Before
private void MyMethod()
{
if (false)
{
}
}
// Take changes from 'HEAD'
// After
private void MyMethod()
{
if (true)
{
}
}
Идентификатор ошибки | Применимые языки | Поддерживаемая версия |
---|---|---|
CS8300, BC37284 | C# и Visual Basic | Visual Studio 2017 версии 15.3 и более поздней |
Действия для удаления ненужного кода
Удаление ненужных директив using/Import
Быстрое действие Удалить ненужные директивы using/импорты удалит все неиспользуемые директивы using
и Import
в текущем файле. При выборе этого элемента удаляются неиспользованные импорты пространства имен.
Удаление ненужного приведения
Если вы приводите тип к другому типу, которому не требуется приведение, можно воспользоваться действием Удалить ненужное приведение.
Удалить неиспользуемые переменные
Это быстрое действие позволяет удалить объявленные переменные, которые нигде не используются.
// 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 и более поздней |
Действия для добавления недостающего кода
Добавление директив using/imports для типов в ссылочных сборках, пакетах NuGet или других типов в решении
Использование типов, расположенных в других проектах в решении, автоматически отображает быстрые действия, однако другие пользователи должны быть включены на вкладке "Текстовый редактор > параметров > инструментов>" или "Дополнительно" Visual Basic>:
Использование типов, расположенных в других проектах в решении, автоматически отображает быстрые действия, однако другие пользователи должны быть включены на вкладке "Текстовый редактор > параметров > инструментов>" или "Базовый>":
- Предлагать using/import для типов в эталонных сборках
- Предлагать using/import для типов в пакетах NuGet
Если параметр включен, при использовании типа в пространстве имен, которое еще не импортировано, но существует в ссылочной сборке или пакете NuGet, создается директива using/import.
// Before
Debug.WriteLine("Hello");
// using System.Diagnostics;
// After
using System.Diagnostics;
Debug.WriteLine("Hello");
ИД диагностики | Применимые языки |
---|---|
CS0103, BC30451 | C# и Visual Basic |
Добавление отсутствующих элементов case и/или case по умолчанию
При создании оператора switch
на языке C# или оператора Select Case
на Visual Basic можно использовать действие кода, чтобы автоматически добавить отсутствующие элементы case и/или оператор case по умолчанию.
Используйте следующее перечисление и удалите оператор switch
или Select Case
:
Быстрое действие Добавить оба заполняет отсутствующие элементы case и добавляет элементы 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 и более поздних версий |
Преобразование автосвойства в полное свойство
Это быстрое действие позволяет преобразовать автосвойство в полное свойство, и наоборот.
// 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 и более поздних |
Преобразование тела блока в элемент с телом выражения
Это быстрое действие позволяет преобразовать тело блока в элемент с телом выражения. Оно предназначено для методов, конструкторов, операторов, свойств, индексаторов и методов доступа.
//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. и более поздних версий |
Введение сопоставления шаблонов
Это быстрое действие предлагает использовать сопоставление шаблонов с приведениями и проверкой на NULL в C#.
// 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
и изменив тип возвращаемого значения. Используйте параметр Синхронизация метода в меню быстрых действий.
// Before
async Task<int> MyAsyncMethod()
{
return 3;
}
// Make method synchronous
// After
int MyAsyncMethod()
{
return 3;
}
Идентификатор ошибки | Применимые языки |
---|---|
CS1998, BC42356 | C# и Visual Basic |
Превращение метода в асинхронный
При указании ключевого слова await
или Await
в методе предполагается, что сам метод помечен ключевым словом async
или Async
. Однако если это не так, появится быстрое действие, позволяющее сделать метод асинхронным. Используйте параметр Make method/Function asynchronous (Сделать метод/функцию асинхронными) в меню быстрых действий.
// Before
int MyAsyncMethod()
{
return await Task.Run(...);
}
// Make method asynchronous
// After
async Task<int> MyAsyncMethod()
{
return await Task.Run(...);
}
Идентификатор ошибки | Применимые языки | Поддерживаемая версия |
---|---|---|
CS4032, BC37057 | C# и Visual Basic | Visual Studio 2017 и более поздних версий |