Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
As seções neste tópico listam algumas das Ações Rápidas comuns aplicáveis ao código C# e ao Visual Basic. Essas ações são correções de código para diagnóstico de compilador ou analisadores internos da Plataforma do Compilador do .NET no Visual Studio.
Ações que corrigem erros
As Ações Rápidas nesta seção corrige erros no código que fariam com que um build falhasse. Quando as Ações Rápidas estão disponíveis para corrigir um erro em uma linha de código, o ícone exibido na margem ou abaixo do rabiscos vermelho é uma lâmpada com um 'x' vermelho.
Corrigir símbolo ou palavra-chave com ortografia incorreta
Se você acidentalmente digitar incorretamente um tipo ou palavra-chave no Visual Studio, essa Ação Rápida a corrigirá automaticamente para você. Você verá esses itens no menu de lâmpada como "Alterar '<palavra> incorreta' para '<palavra> correta'". Por exemplo:
// Before
private viod MyMethod()
{
}
// Change 'viod' to 'void'
// After
private void MyMethod()
{
}
| ID do erro | Idiomas aplicáveis |
|---|---|
| CS0103, BC30002 | C# e Visual Basic |
Resolver conflito de mesclagem do Git
Essas Ações Rápidas permitem resolver conflitos de mesclagem do Git "fazendo uma alteração", o que remove o código e os marcadores conflitantes.
// Before
private void MyMethod()
{
if (false)
{
}
}
// Take changes from 'HEAD'
// After
private void MyMethod()
{
if (true)
{
}
}
| ID do erro | Idiomas aplicáveis | Versão compatível |
|---|---|---|
| CS8300, BC37284 | C# e Visual Basic | Visual Studio 2017 versão 15.3 e posterior |
Ações que removem código desnecessário
Remover usos/importações desnecessários
A Ação Rápida Remover Usos Desnecessários/Importações remove quaisquer diretivas e Import não usadas using para o arquivo atual. Quando você seleciona esse item, as importações de namespace não usadas são removidas.
Remover conversão desnecessária
Se você converter um tipo em outro tipo que não exija uma conversão, o item Remover Ação Rápida de Conversão Desnecessária removerá a conversão desnecessária.
Remover variáveis não utilizados
Esta Ação Rápida permite que você remova variáveis que foram declaradas, mas nunca usadas em seu código.
// 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 do diagnóstico | Idiomas aplicáveis | Versão compatível |
|---|---|---|
| CS0219, BC42024 | C# e Visual Basic | Visual Studio 2017 versão 15.3 e posterior |
Remover tipo da expressão de valor padrão
Esta Ação Rápida remove o tipo de valor de uma expressão de valor padrão e usa o literal padrão quando o compilador pode inferir o tipo da expressão.
// Before
void DoWork(CancellationToken cancellationToken = default(CancellationToken)) { ... }
// Simplify default expression
// After
void DoWork(CancellationToken cancellationToken = default) { ... }
| ID do diagnóstico | Idiomas aplicáveis | Versão compatível |
|---|---|---|
| IDE0034 | C# 7.1+ | Visual Studio 2017 versão 15.3 e posterior |
Ações que adicionam código ausente
Adicionar usos/importações para tipos em assemblies de referência, pacotes NuGet ou outros tipos em sua solução
O uso de tipos localizados em outros projetos em sua solução exibirá a Ação Rápida automaticamente, no entanto, os outros precisam ser habilitados na guia C# do Editor > de Texto de Opções > de Ferramentas > ou do Visual Basic > Advanced:
- Sugerir usos/importações para tipos em assemblies de referência
- Sugerir usos/importações para tipos em pacotes NuGet
Quando habilitado, se você usar um tipo em um namespace que atualmente não é importado, mas existe em um assembly de referência ou pacote NuGet, a diretiva de uso ou importação será criada.
// Before
Debug.WriteLine("Hello");
// using System.Diagnostics;
// After
using System.Diagnostics;
Debug.WriteLine("Hello");
| ID do diagnóstico | Idiomas aplicáveis |
|---|---|
| CS0103, BC30451 | C# e Visual Basic |
Adicionar casos ausentes/caso padrão/ambos
Ao criar uma switch instrução em C#ou Select Case instrução no Visual Basic, você pode usar uma Ação de Código para adicionar automaticamente itens de caso ausentes, uma instrução de caso padrão ou ambos.
Considere a seguinte enumeração e vazia switch ou instrução Select Case :
Usar a Ação Adicionar Ambas as Ações Rápidas preenche os casos ausentes e adiciona um caso padrão:
switch(myEnum)
{
case MyEnum.Item1:
break;
case MyEnum.Item2:
break;
case MyEnum.Item3:
break;
default:
break;
}
| ID do diagnóstico | Idiomas aplicáveis | Versão compatível |
|---|---|---|
| IDE0010 | C# e Visual Basic | Visual Studio 2017 versão 15.3 e posterior |
Adicionar verificações nulas para parâmetros
Essa Ação Rápida permite que você adicione uma verificação em seu código para informar se um parâmetro é nulo.
// 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));
}
}
| Idiomas aplicáveis | Versão compatível |
|---|---|
| C# e Visual Basic | Visual Studio 2017 versão 15.3 e posterior |
Adicionar nome do argumento
// 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);
| Idiomas aplicáveis | Versão compatível |
|---|---|
| C# e Visual Basic | Visual Studio 2017 versão 15.3 e posterior |
Adicionar chaves
A Ação Rápida Adicionar chaves encapsula chaves em torno de instruções de linha if única.
// Before
if (true)
return "hello,world";
// Add braces
// After
if (true)
{
return "hello,world";
}
| ID do diagnóstico | Idiomas aplicáveis | Versão compatível |
|---|---|---|
| IDE0011 | C# | Visual Studio 2017 e posterior |
Adicionar e ordenar modificadores
Essas Ações Rápidas ajudam a organizar modificadores, permitindo que você classifique os modificadores de acessibilidade existentes e adicione modificadores de acessibilidade ausentes.
// 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;
| ID do diagnóstico | Idiomas aplicáveis | Versão compatível |
|---|---|---|
| IDE0036 | C# e Visual Basic | Visual Studio 2017 versão 15.5 e posterior |
| IDE0040 | C# e Visual Basic | Visual Studio 2017 versão 15.5 e posterior |
Transformações de código
Converter o constructo 'if' em 'switch'
Esta Ação Rápida permite converter um constructo if-then-else em um constructo de comutador .
// 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;
}
| Idiomas aplicáveis | Versão compatível |
|---|---|
| C# e Visual Basic | Visual Studio 2017 versão 15.3 e posterior |
Converter em cadeia de caracteres interpolada
Cadeias de caracteres interpoladas são uma maneira fácil de expressar cadeias de caracteres com variáveis inseridas, semelhantes ao método String.Format . Essa Ação Rápida reconhece casos em que as cadeias de caracteres são concatenadas ou usam String.Format e altera o uso para uma cadeia de caracteres interpolada.
// 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";
| Idiomas aplicáveis | Versão compatível |
|---|---|
| C# 6.0+ e Visual Basic 14+ | Visual Studio 2017 e posterior |
Usar inicializadores de objeto
Esta Ação Rápida permite que você use inicializadores de objeto em vez de invocar o construtor e ter linhas adicionais de instruções de atribuição.
// Before
var c = new Customer();
c.Age = 21;
// Object initialization can be simplified
// After
var c = new Customer() { Age = 21 };
| ID do diagnóstico | Idiomas aplicáveis | Versão compatível |
|---|---|---|
| IDE0017 | C# e Visual Basic | Visual Studio 2017 e posterior |
Usar inicializadores de coleção
Esta Ação Rápida permite que você use inicializadores de coleção em vez de várias chamadas para o Add método de sua classe.
// 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 };
| ID do diagnóstico | Idiomas aplicáveis | Versão compatível |
|---|---|---|
| IDE0028 | C# e Visual Basic | Visual Studio 2017 e posterior |
Converter propriedade automática em propriedade completa
Esta Ação Rápida permite que você converta uma propriedade automática em uma propriedade completa e vice-versa.
// Before
private int MyProperty { get; set; }
// Convert to full property
// After
private int MyProperty
{
get { return _myProperty; }
set { _myProperty = value; }
}
| Idiomas aplicáveis | Versão compatível |
|---|---|
| C# e Visual Basic | Visual Studio 2017 versão 15.5 e posterior |
Converter corpo do bloco em membro com corpo de expressão
Esta Ação Rápida permite converter corpos de bloco em membros aptos à expressão para métodos, construtores, operadores, propriedades, indexadores e acessadores.
//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);
}
| ID do diagnóstico | Idiomas aplicáveis | Versão compatível |
|---|---|---|
| IDE0021-27 | C# 6.0+ | Visual Studio 2017 e posterior |
Converter função anônima em função local
Esta Ação Rápida converte funções anônimas em funções locais.
// 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);
}
Converter 'ReferenceEquals' em 'is null'
| ID do diagnóstico | Idiomas aplicáveis | Versão compatível |
|---|---|---|
| IDE0041 | C# 7.0+ | Visual Studio 2017 versão 15.5 e posterior |
Essa Ação Rápida sugere o uso da correspondência de padrões em vez do ReferenceEquals padrão de codificação, sempre que possível.
// Before
var value = "someString";
if (object.ReferenceEquals(value, null))
{
return;
}
// Use 'is null' check
// After
var value = "someString";
if (value is null)
{
return;
}
| ID do diagnóstico | Idiomas aplicáveis | Versão compatível |
|---|---|---|
| IDE0039 | C# 7.0+ | Visual Studio 2017 versão 15. e posterior |
Introduzir correspondência de padrões
Esta Ação Rápida sugere o uso de correspondência de padrões com conversões e verificações nulas em 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)
{
...
}
| ID do diagnóstico | Idiomas aplicáveis | Versão compatível |
|---|---|---|
| IDE0020 | C# 7.0+ | Visual Studio 2017 e posterior |
| IDE0019 | C# 7.0+ | Visual Studio 2017 e posterior |
Alterar base para literais numéricos
Esta Ação Rápida permite converter um literal numérico de um sistema numérico base para outro. Por exemplo, você pode alterar um número para hexadecimal ou para formato binário.
| Idiomas aplicáveis | Versão compatível |
|---|---|
| C# 7.0+ e Visual Basic 14+ | Visual Studio 2017 versão 15.3 e posterior |
Inserir separadores de dígito em literais
Esta Ação Rápida permite adicionar caracteres separadores a valores literais.
| Idiomas aplicáveis | Versão compatível |
|---|---|
| C# 7.0+ e Visual Basic 14+ | Visual Studio 2017 versão 15.3 e posterior |
Usar nomes de tupla explícitos
Esta Ação Rápida identifica áreas em que o nome da tupla explícita pode ser usado em vez de Item1, Item2 etc.
// 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;
| ID do diagnóstico | Idiomas aplicáveis | Versão compatível |
|---|---|---|
| IDE0033 | C# 7.0+ e Visual Basic 15+ | Visual Studio 2017 e posterior |
Usar nomes inferidos
Esta Ação Rápida aponta quando o código pode ser simplificado para usar nomes de membro inferidos em tipos anônimos ou nomes de elementos inferidos em tuplas.
// 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);
| ID do diagnóstico | Idiomas aplicáveis | Versão compatível |
|---|---|---|
| IDE0037 | C# | Visual Studio 2017 versão 15.5 e posterior |
| IDE0037 | C# 7.1+ | Visual Studio 2017 versão 15.5 e posterior |
Declaração de tupla de desconstrução
Esta Ação Rápida permite desconstruir declarações de variável de tupla.
// 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}");
| ID do diagnóstico | Idiomas aplicáveis | Versão compatível |
|---|---|---|
| IDE0042 | C# 7.0+ | Visual Studio 2017 versão 15.5 e posterior |
Tornar o método síncrono
Ao usar a palavra-chave ou Async a async palavra-chave em um método, espera-se que dentro desse método a palavra-chave ou Await a await palavra-chave também seja usada. No entanto, se esse não for o caso, será exibida uma Ação Rápida que torna o método síncrono removendo a async palavra-chave ou Async alterando o tipo de retorno. Use a opção Fazer método síncrono no menu Ações Rápidas.
// Before
async Task<int> MyAsyncMethod()
{
return 3;
}
// Make method synchronous
// After
int MyAsyncMethod()
{
return 3;
}
| ID do erro | Idiomas aplicáveis |
|---|---|
| CS1998, BC42356 | C# e Visual Basic |
Tornar o método assíncrono
Ao usar a palavra-chave ou Await dentro await de um método, espera-se que o método seja marcado com a palavra-chave ou Async a async palavra-chave. No entanto, se esse não for o caso, será exibida uma Ação Rápida que torna o método assíncrono. Use a opção Fazer método/Função assíncrona no menu Ações Rápidas.
// Before
int MyAsyncMethod()
{
return await Task.Run(...);
}
// Make method asynchronous
// After
async Task<int> MyAsyncMethod()
{
return await Task.Run(...);
}
| ID do erro | Idiomas aplicáveis | Versão compatível |
|---|---|---|
| CS4032, BC37057 | C# e Visual Basic | Visual Studio 2017 e posterior |