名前の変更リファクタリング (C#)
[名前の変更] は、Visual Studio 統合開発環境 (IDE: Integrated Development Environment) のリファクタリング機能です。これにより、フィールド、ローカル変数、メソッド、名前空間、型などのコード シンボルの識別子の名前を変更する簡単な方法が提供されます。[名前の変更] を使用すると、コメントや文字列内の名前を変更したり、識別子の宣言と呼び出しを変更したりできます。
[!メモ]
Visual Studio のソース管理を使用しているときは、名前の変更リファクタリングを実行する前に、最新バージョンのソースを取得してください。
[名前の変更] リファクタリングは、次の Visual Studio 機能で利用できます。
機能 |
IDE におけるリファクタリングの動作 |
---|---|
コード エディター |
コード エディターでは、カーソルを特定の型のコード シンボルに移動すると、名前の変更リファクタリングを利用できます。カーソルがこの位置にあるときに、入力を開始 [名前の変更] のコマンドをショートカット キー (Ctrl + スマート タグ、ショートカット メニュー、または [リファクター] のメニューの [名前の変更] のコマンドのオプションによって、R、Ctrl + R)、またはできます。 |
クラス ビュー |
クラス ビューで識別子を選択した場合、ショートカット メニューまたは [リファクター] メニューから名前の変更リファクタリングを利用できます。 |
オブジェクト ブラウザー |
オブジェクト ブラウザーで識別子を選択した場合、[リファクター] メニューだけから名前の変更リファクタリングを利用できます。 |
Windows フォーム デザイナーのプロパティ グリッド |
Windows フォーム デザイナーの [プロパティ グリッド] でコントロールの名前を変更すると、そのコントロールの名前の変更操作が開始されます。[名前の変更] ダイアログ ボックスは表示されません。 |
ソリューション エクスプローラー |
ソリューション エクスプローラーでは、ショートカット メニューから [名前の変更] を利用できます。選択したソース ファイルに、そのファイル名と同じクラス名を持つクラスが含まれている場合は、このコマンドを使用して、ソース ファイルの名前の変更と名前の変更リファクタリングを同時に実行できます。 たとえば、既定の Windows ベースのアプリケーションを作成してから、Form1.cs の名前を TestForm.cs に変更すると、ソース ファイル名の Form1.cs が TestForm.cs に変更され、Form1 クラスおよびそのクラスへのすべての参照の名前が TestForm に変更されます。
メモ
[元に戻す] コマンド (Ctrl + Z) を実行すると、コード内の名前の変更リファクタリングだけが元に戻り、ファイル名は元の名前に戻りません。
選択したソース ファイルに、そのファイル名と同じクラス名を持つクラスが含まれていない場合は、ソリューション エクスプローラーの [名前の変更] を実行すると、ソース ファイルの名前だけが変更され、名前の変更リファクタリングは実行されません。 |
名前変更の操作
[名前の変更] を実行すると、リファクタリング エンジンは、次の表に示すように、各コード シンボルに基づいて名前の変更操作を実行します。
コード シンボル |
名前変更の操作 |
---|---|
フィールド |
当該フィールドの宣言と使用箇所が、新しい名前に変更されます。 |
ローカル変数 |
当該変数の宣言と使用箇所が、新しい名前に変更されます。 |
メソッド |
当該メソッドの名前と、当該メソッドへのすべての参照が、新しい名前に変更されます。
メモ
拡張メソッドの名前を変更すると、その拡張メソッドが静的メソッドとして使用されているか、インスタンス メソッドとして使用されているかに関係なく、スコープ内にあるメソッドのすべてのインスタンスに名前の変更操作が反映されます。詳細については、「拡張メソッド (C# プログラミング ガイド)」を参照してください。
|
名前空間 |
宣言、すべての using ステートメント、および完全修飾名において、当該名前空間の名前が新しい名前に変更されます。
メモ
名前空間の名前を変更すると、Visual Studio により、[プロジェクト デザイナー] ウィンドウの [アプリケーション] ページにある既定の名前空間プロパティが更新されます。このプロパティは、[編集] メニューの [元に戻す] をクリックしてもリセットできません。既定の名前空間 プロパティの値をリセットするには、[プロジェクト デザイナー] ウィンドウでプロパティを変更します。詳細については、「[アプリケーション] ページ (プロジェクト デザイナー) (C#)」を参照してください。
|
プロパティ |
当該プロパティの宣言と使用箇所が、新しい名前に変更されます。 |
型 |
型のすべての宣言とすべての使用箇所 (コンストラクターとデストラクターを含む) を新しい名前に変更します。部分型の場合、名前の変更操作はすべての部分に反映されます。 |
識別子の名前を変更するには
RenameIdentifier という名前のコンソール アプリケーションを作成し、Program を次のプログラム例で置き換えます。
class ProtoClassA { // Invoke on 'MethodB'. public void MethodB(int i, bool b) { } } class ProtoClassC { void D() { ProtoClassA MyClassA = new ProtoClassA(); // Invoke on 'MethodB'. MyClassA.MethodB(0, false); } }
メソッド宣言またはメソッド呼び出しで、MethodB にカーソルを移動します。
[リファクター] メニューの [名前の変更] をクリックします。[名前の変更] ダイアログ ボックスが表示されます。
[名前の変更] ダイアログ ボックスを表示するには、カーソルを右クリックし、コンテキスト メニューの [リファクター] をポイントして、[名前の変更] をクリックする方法もあります。
[新しい名前] フィールドに「MethodC」と入力します。
[コメント内の検索] チェック ボックスをオンにします。
[OK] をクリックします。
[変更のプレビュー] ダイアログ ボックスの [適用] をクリックします。
スマート タグを使用して識別子の名前を変更するには
RenameIdentifier という名前のコンソール アプリケーションを作成し、Program を次のプログラム例で置き換えます。
class ProtoClassA { // Invoke on 'MethodB'. public void MethodB(int i, bool b) { } } class ProtoClassC { void D() { ProtoClassA MyClassA = new ProtoClassA(); // Invoke on 'MethodB'. MyClassA.MethodB(0, false); } }
MethodB の宣言で、メソッド識別子を入力するか BackSpace キーを押します。その識別子の下に、スマート タグのプロンプトが表示されます。
[!メモ]
識別子の宣言でスマート タグを使用して呼び出すことができるのは、名前の変更リファクタリングだけです。
Shift キーと Alt キーを押しながら F10 キーを押し、次に↓キーを押して、スマート タグ メニューを表示します。
または
マウス ポインターをスマート タグ プロンプト上に移動して、スマート タグを表示します。マウス ポインターをスマート タグ上に移動し、下向きの矢印をクリックして、スマート タグ メニューを表示します。
コードの変更をプレビューせずに、名前の変更リファクタリングを呼び出すには、[名前を '<identifer1>' から '<identifier2>' に変更] をクリックします。<identifer1> に対するすべての参照が自動的に <identifier2> に更新されます。
または
コードの変更をプレビューし、名前の変更リファクタリングを呼び出すには、[プレビューで名前の変更] をクリックします。[変更のプレビュー] ダイアログ ボックスが表示されます。
解説
実装またはオーバーライドされたメンバーの名前の変更
他の型のメンバーを実装またはオーバーライドするメンバー、あるいは他の型のメンバーによって実装またはオーバーライドされるメンバーの名前を変更しようとすると、その変更が原因で連鎖更新が発生することを通知するダイアログ ボックスが Visual Studio から表示されます。[続行] をクリックすると、リファクタリング エンジンは、名前を変更するメンバーと実装関係またはオーバーライド関係にある基本型および派生型のすべてのメンバーを再帰的に検出し、その名前を変更します。
次のコード例に、実装関係またはオーバーライド関係にあるメンバーを示します。
interface IBase
{
void Method();
}
public class Base
{
public void Method()
{ }
public virtual void Method(int i)
{ }
}
public class Derived : Base, IBase
{
public new void Method()
{ }
public override void Method(int i)
{ }
}
public class C : IBase
{
public void Method()
{ }
}
この例の C.Method() は Ibase.Method() を実装しています。このため、C.Method() の名前を変更すると、Ibase.Method() の名前も変更されます。その後、リファクタリング エンジンは、Derived.Method() が Ibase.Method() を実装していることを再帰的に確認し、Derived.Method() の名前を変更します。Base.Method() の名前は変更しません。これは、Derived.Method() が Base.Method() をオーバーライドしていないからです。ユーザーが [名前の変更] ダイアログ ボックスで [オーバーロードの名前を変更する] チェック ボックスをオンにしていない限り、リファクタリング エンジンはここで停止します。
[オーバーロードの名前を変更する] チェック ボックスがオンになっている場合、リファクタリング エンジンは、Derived.Method() をオーバーロードする Derived.Method(int i)、Derived.Method(int i) によってオーバーライドされる Base.Method(int i)、および Base.Method(int i) のオーバーロードである Base.Method() の名前を変更します。
[!メモ]
参照アセンブリで定義されたメンバーの名前を変更しようとすると、その変更が原因でビルド エラーが発生することを通知するダイアログ ボックスが表示されます。
匿名型のプロパティの名前の変更
匿名型のプロパティの名前を変更すると、同じプロパティを持つ他の匿名型のプロパティにも名前の変更操作が反映されます。この動作を次の例に示します。
var a = new { ID = 1};
var b = new { ID = 2};
上のコードでは、ID の名前を変更すると、両方のステートメントの ID が変更されます。これは、両方のステートメントの基になる匿名型が同じであるためです。
var companyIDs =
from c in companylist
select new { ID = c.ID, Name = c.Name};
var orderIDs =
from o in orderlist
select new { ID = o.ID, Item = o.Name};
上のコードでは、companyIDs と orderIDs はプロパティが異なるため、ID の変更によって名前が変更される ID のインスタンスは 1 つだけです。