名前の変更

更新 : 2007 年 11 月

[名前の変更] は、Visual Studio 統合開発環境 (IDE: Integrated Development Environment) のリファクタリング機能です。これにより、フィールド、ローカル変数、メソッド、名前空間、型などのコード シンボルの識別子の名前を変更する簡単な方法が提供されます。[名前の変更] を使用すると、コメントや文字列内の名前を変更したり、識別子の宣言と呼び出しを変更したりできます。

6kxxabwd.alert_note(ja-jp,VS.90).gifメモ :

Visual Studio のソース管理を使用しているときは、名前の変更リファクタリングを実行する前に、最新バージョンのソースを取得してください。

[名前の変更] リファクタリングは、次の Visual Studio 機能で利用できます。

機能

IDE におけるリファクタリングの動作

コード エディタ

コード エディタでは、カーソルを特定の型のコード シンボルに移動すると、名前の変更リファクタリングを利用できます。カーソルがこの位置にあるときに、キーボード ショートカット (Ctrl + R、R) を押すか、スマート タグ、ショートカット メニュー、または [リファクタ] メニューの [名前の変更] をクリックすると、[名前の変更] コマンドを呼び出すことができます。[名前の変更] コマンドを呼び出すと、[名前の変更] ダイアログ ボックスが表示されます。詳細については、「[名前の変更] ダイアログ ボックス」および「方法 : 識別子の名前を変更する」を参照してください。

クラス ビュー

クラス ビューで識別子を選択した場合、ショートカット メニューまたは [リファクタ] メニューから名前の変更リファクタリングを利用できます。

オブジェクト ブラウザ

オブジェクト ブラウザで識別子を選択した場合、[リファクタ] メニューだけから名前の変更リファクタリングを利用できます。

Windows フォーム デザイナのプロパティ グリッド

Windows フォーム デザイナの [プロパティ グリッド] でコントロールの名前を変更すると、そのコントロールの名前の変更操作が開始されます。[名前の変更] ダイアログ ボックスは表示されません。

ソリューション エクスプローラ

ソリューション エクスプローラでは、ショートカット メニューから [名前の変更] を利用できます。選択したソース ファイルに、そのファイル名と同じクラス名を持つクラスが含まれている場合は、このコマンドを使用して、ソース ファイルの名前の変更と名前の変更リファクタリングを同時に実行できます。

たとえば、既定の Windows アプリケーションを作成してから、Form1.cs の名前を TestForm.cs に変更すると、ソース ファイル名の Form1.cs が TestForm.cs に変更され、Form1 クラスおよびそのクラスへのすべての参照の名前が TestForm に変更されます。

6kxxabwd.alert_note(ja-jp,VS.90).gifメモ :
[元に戻す] コマンド (Ctrl + Z) を実行すると、コード内の名前の変更リファクタリングだけが元に戻り、ファイル名は元の名前に戻りません。

選択したソース ファイルに、そのファイル名と同じクラス名を持つクラスが含まれていない場合は、ソリューション エクスプローラの [名前の変更] を実行すると、ソース ファイルの名前だけが変更され、名前の変更リファクタリングは実行されません。

名前の変更操作

[名前の変更] を実行すると、リファクタリング エンジンは、次の表に示すように、各コード シンボルに基づいて名前の変更操作を実行します。

コード シンボル

名前の変更操作

フィールド

当該フィールドの宣言と使用箇所が、新しい名前に変更されます。

ローカル変数

当該変数の宣言と使用箇所が、新しい名前に変更されます。

メソッド

当該メソッドの名前と、当該メソッドへのすべての参照が、新しい名前に変更されます。

6kxxabwd.alert_note(ja-jp,VS.90).gifメモ :
拡張メソッドの名前を変更すると、その拡張メソッドが静的メソッドとして使用されているか、インスタンス メソッドとして使用されているかに関係なく、スコープ内にあるメソッドのすべてのインスタンスに名前の変更操作が反映されます。詳細については、「拡張メソッド (C# プログラミング ガイド)」を参照してください。

名前空間

宣言、すべての using ステートメント、および完全修飾名において、当該名前空間の名前が新しい名前に変更されます。

6kxxabwd.alert_note(ja-jp,VS.90).gifメモ :
名前空間の名前を変更すると、Visual Studio により、[プロジェクト デザイナ] ウィンドウの [アプリケーション] ページにある既定の名前空間プロパティが更新されます。このプロパティは、[編集] メニューの [元に戻す] をクリックしてもリセットできません。既定の名前空間プロパティの値をリセットするには、[プロジェクト デザイナ] ウィンドウでプロパティを変更します。詳細については、「[アプリケーション] ページ (プロジェクト デザイナ) (C#)」を参照してください。

プロパティ

当該プロパティの宣言と使用箇所が、新しい名前に変更されます。

型のすべての宣言とすべての使用箇所 (コンストラクタとデストラクタを含む) を新しい名前に変更します。部分型の場合、名前の変更操作はすべての部分に反映されます。

解説

実装またはオーバーライドされたメンバの名前の変更

他の型のメンバを実装またはオーバーライドするメンバ、あるいは他の型のメンバによって実装またはオーバーライドされるメンバの名前を変更しようとすると、その変更が原因で連鎖更新が発生することを通知するダイアログ ボックスが 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() の名前を変更します。

6kxxabwd.alert_note(ja-jp,VS.90).gifメモ :

参照アセンブリで定義されたメンバの名前を変更しようとすると、その変更が原因でビルド エラーが発生することを通知するダイアログ ボックスが表示されます。

匿名型のプロパティの名前の変更

匿名型のプロパティの名前を変更すると、同じプロパティを持つ他の匿名型のプロパティにも名前の変更操作が反映されます。この動作を次の例に示します。

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 つだけです。

参照

処理手順

方法 : 識別子の名前を変更する

概念

リファクタリング

参照

匿名型 (C# プログラミング ガイド)

その他の技術情報

Visual Studio のソース管理