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

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

Действия, которые устраняют ошибки

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

Значок и меню

Исправление символа или ключевого слова с ошибками

Если вы случайно пропустили тип или ключевое слово в 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 директивы для текущего файла. При выборе этого элемента импортируются неиспользуемые пространства имен.

Удаление ненужного приведения

При приведение типа к другому типу, который не требует приведения, элемент "Удалить ненужное быстрое действие" удаляет ненужный приведение.

// 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 и более поздних версий

Действия, добавляющие отсутствующий код

Добавление usings/import для типов в ссылочных сборках, пакетах NuGet или других типах в решении

Использование типов, расположенных в других проектах в решении, автоматически отображает быстрые действия, однако другие пользователи должны быть включены на вкладке "Текстовый редактор > параметров > инструментов>" или"Дополнительно" 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 можно использовать действие кода для автоматического добавления отсутствующих элементов регистра, инструкции по умолчанию или обоих вариантов.

Рассмотрим следующее перечисление и пустую 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;
}
Идентификатор диагностики Применимые языки Поддерживаемая версия
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 в конструкцию коммутатора .

// 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 в значение 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 ключевого слова в методе ожидается, что внутри этого метода Awaitawait также используется ключевое слово. Тем не менее, если это не так, отображается быстрое действие, которое делает метод синхронным путем удаления 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 слова. Однако если это не так, появится быстрое действие, которое делает метод асинхронным. Используйте асинхронный параметр метода или функции из меню "Быстрые действия".

// 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 и более поздних версий

См. также