Распространенные быстрые действия

В этих разделах статьи перечислены некоторые распространенные быстрые действия, которые применяются как к коду C#, так и к коду Visual Basic. Эти действия являются исправлениями кода для диагностики компилятора или встроенных анализаторов .NET Compiler Platform в Visual Studio.

Действия для исправления ошибок

Описанные в этом разделе быстрые действия исправляют ошибки в коде, которые в противном случае привели бы к сбою сборки. Когда для устранения ошибки в строке кода доступны быстрые действия, значок, отображаемый в поле или под красной волнистой линией, имеет форму лампочки с красным крестом.

Quick Actions error icon and menu

Исправление опечаток в символах или ключевых словах

Если вы неправильно вводите тип или ключевое слово в 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
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);
}
ИД диагностики Применимые языки Поддерживаемая версия
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:

enum MyEnum
{
    Item1,
    Item2,
    Item3
}

...

MyEnum myEnum = MyEnum.Item1;

switch(myEnum)
{
}

Быстрое действие Добавить оба заполняет отсутствующие элементы 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 и более поздних версий

Изменение основания для числовых литералов

Это быстрое действие позволяет преобразовать числовой литерал в систему счисления с другим основанием. Например, можно перевести любое шестнадцатеричное число в двоичное.

// Before
int countdown = 2097152;

// Convert to hex

// After
int countdown = 0x200000;
Применимые языки Поддерживаемая версия
C# 7.0 и более поздние версии, Visual Basic 14 и более поздние версии Visual Studio 2017 версии 15.3 и более поздней

Добавление разделителей между цифрами в литералах

Это быстрое действие позволяет добавлять знаки-разделители в литеральные значения.

// Before
int countdown = 1000000;

// Separate thousands

// After
int countdown = 1_000_000;
Применимые языки Поддерживаемая версия
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 и более поздних версий

См. также