メソッドの展開
更新 : 2007 年 11 月
[メソッドの抽出] は、既存のメンバのコード片から新規メソッドを簡単に作成できるリファクタリング操作です。詳細については、「リファクタリング」を参照してください。
[メソッドの抽出] を使用すると、既存メンバのコード ブロック内からコードの選択部分を抽出することで、新規メソッドを作成できます。抽出された新しいメソッドには選択したコードが含められ、既存のメンバ内の選択したコードは、新規メソッドへの呼び出しに置き換えられます。コード片を独立したメソッドにすることで、コードをすばやく正確に再構成でき、再利用性と読みやすさが向上します。
[メソッドの抽出] には、次の利点があります。
メソッドの独立性と再利用可能性を重視することで、コーディングの推奨手順を遵守できる。
適切に構成することで、コードを自己文書化できる。
説明的な名前を使用すると、高水準のメソッドも一連のコメントのように読みやすくなる。
オーバーライドを単純にするために、詳細なメソッドの作成が促進される。
コードの重複を減らすことができる。
解説
[メソッドの抽出] を使用すると、新規メソッドが同じクラスのソース メンバの後に挿入されます。
部分型
クラスが部分型である場合は、[メソッドの抽出] によって新規メソッドがソース メンバの直後に作成されます。[メソッドの抽出] では、新規メソッドのシグネチャを決定し、新規メソッド内のコードでインスタンス データが参照されていない場合は静的メソッドを作成します。
ジェネリック型パラメータ
制約のないジェネリック型パラメータを持つメソッドを抽出する場合、生成されるコードでは、そのパラメータに値が割り当てられない限り ref 修飾子は追加されません。抽出されたメソッドでジェネリック型引数として参照型をサポートする場合は、メソッド シグネチャ内のパラメータに手動で ref 修飾子を追加する必要があります。
匿名メソッド
匿名メソッドにローカル変数への参照が含まれていて、そのローカル変数が匿名メソッドの外部で宣言または参照されている場合、匿名メソッドの一部を抽出しようとすると、セマンティクスが変更される可能性があるという警告が表示されます。
匿名メソッドでローカル変数の値を使用する場合、その値は匿名メソッドの実行時に取得されます。匿名メソッドが別のメソッドに抽出される場合、ローカル変数の値は、抽出されたメソッドの呼び出し時に取得されます。
このセマンティクスの変更について、次に例を示します。このコードを実行すると、コンソールには "11" が出力されます。[メソッドの抽出] を使用して、コード コメントでマークされているコードの一部を独自メソッドに抽出し、その後リファクタリングされたコードを実行すると、コンソールには "10" が出力されます。
class Program
{
delegate void D();
D d;
static void Main(string[] args)
{
Program p = new Program();
int i = 10;
/*begin extraction*/
p.d = delegate { Console.WriteLine(i++); };
/*end extraction*/
i++;
p.d();
}
}
この問題を回避するには、匿名メソッドで使用されているローカル変数をクラスのフィールドにします。