共通のクイック アクション
このトピックのセクションでは、C# と Visual Basic 両方のコードに共通に適用されるクイック アクションの一部を示します。 このアクションは、コンパイラ診断、または Visual Studio の組み込みの .NET Compiler Platform アナライザーのいずれかのコード修正です。
エラーを修正するアクション
このセクションのクイック アクションにより、ビルドの失敗の原因となるコードのエラーが修正されます。 コード行のエラーの修正でクイック アクションが使用できる場合に余白または赤の波線の下に表示される電球のアイコンには、赤の 'x' が表示されます。
記号やキーワードのスペルミスの修正
Visual Studio で型やキーワードのスペルを誤って入力した場合、このクイック アクションは自動的にそれを修正します。 電球メニューでは ["Change '<misspelled word>' to '<correct word>'"] ('スペルが正しくない単語' を 'スペルが正しい単語' に変更) と表示されます。 たとえば次のような点です。
// 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 以降 |
不要なコードを削除するアクション
不必要な 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);
}
診断 ID | 適用可能な言語 | サポートされているバージョン |
---|---|---|
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) { ... }
診断 ID | 適用可能な言語 | サポートされているバージョン |
---|---|---|
IDE0034 | C# 7.1+ | Visual Studio 2017 バージョン 15.3 以降 |
不足しているコードを追加するアクション
参照アセンブリの型、NuGet パッケージの型、またはソリューション内の他の型に using/import を追加する
ソリューション内の他のプロジェクトにある型を使用すると、クイック アクションが自動的に表示されますが、それ以外は [ツール] > [オプション] > [テキスト エディター] > [C#] または [Visual Basic] > [詳細設定] タブで有効にする必要があります。
ソリューション内の他のプロジェクトにある型を使用すると、クイック アクションが自動的に表示されますが、それ以外は [ツール] > [オプション] > [テキスト エディター] > [C#] または [Basic] > [詳細設定] タブで有効にする必要があります。
- 参照アセンブリの型に using/import を提案する
- NuGet パッケージの型に using/import を提案する
有効にした場合、現在はインポートされていなくても参照アセンブリまたは NuGet パッケージには存在する名前空間の型を使うと、using または import ディレクティブが作成されます。
// Before
Debug.WriteLine("Hello");
// using System.Diagnostics;
// After
using System.Diagnostics;
Debug.WriteLine("Hello");
診断 ID | 適用可能な言語 |
---|---|
CS0103、BC30451 | C# と Visual Basic |
足りないケース、既定のケース、または両方を追加する
switch
ステートメント (C#) または Select Case
ステートメント (Visual Basic) を作成するときは、コード アクションを使って、足りないケース項目、既定のケースのステートメント、または両方を自動的に追加できます。
次の列挙型を検討し、switch
ステートメントまたは Select Case
ステートメントを空にします。
[Add Both]\(両方追加\) のクイック アクションを使用すると、足りない case が入力されるとともに default の条件が追加されます。
switch(myEnum)
{
case MyEnum.Item1:
break;
case MyEnum.Item2:
break;
case MyEnum.Item3:
break;
default:
break;
}
診断 ID | 適用可能な言語 | サポートされているバージョン |
---|---|---|
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";
}
診断 ID | 適用可能な言語 | サポートされているバージョン |
---|---|---|
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;
診断 ID | 適用可能な言語 | サポートされているバージョン |
---|---|---|
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 };
診断 ID | 適用可能な言語 | サポートされているバージョン |
---|---|---|
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 };
診断 ID | 適用可能な言語 | サポートされているバージョン |
---|---|---|
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);
}
診断 ID | 適用可能な言語 | サポートされているバージョン |
---|---|---|
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' に変換する
診断 ID | 適用可能な言語 | サポートされているバージョン |
---|---|---|
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;
}
診断 ID | 適用可能な言語 | サポートされているバージョン |
---|---|---|
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)
{
...
}
診断 ID | 適用可能な言語 | サポートされているバージョン |
---|---|---|
IDE0020 | C# 7.0+ | Visual Studio 2017 以降 |
IDE0019 | C# 7.0+ | Visual Studio 2017 以降 |
数値リテラルの基本を変更する
このクイック アクションでは、数値リテラルの基本数値システムを別のものに変換できます。 たとえば、数値を 16 進数からバイナリ形式に変更できます。
適用可能な言語 | サポートされているバージョン |
---|---|
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;
診断 ID | 適用可能な言語 | サポートされているバージョン |
---|---|---|
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);
診断 ID | 適用可能な言語 | サポートされているバージョン |
---|---|---|
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}");
診断 ID | 適用可能な言語 | サポートされているバージョン |
---|---|---|
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;
}
エラー ID | 適用可能な言語 |
---|---|
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(...);
}
エラー ID | 適用可能な言語 | サポートされているバージョン |
---|---|---|
CS4032、BC37057 | C# と Visual Basic | Visual Studio 2017 以降 |