フィールドのカプセル化リファクタリング (C#)
[フィールドのカプセル化] リファクタリング操作により、既存のフィールドからプロパティをすばやく作成し、コードを新規プロパティへの参照に合わせて更新できます。
フィールドが public である場合、他のオブジェクトは、そのフィールドを所有するオブジェクトに検知されずに、そのフィールドに直接アクセスして変更できます。プロパティを使用してこのようなフィールドをカプセル化することにより、フィールドへの直接アクセスを禁止できます。
新規プロパティを作成するために、[フィールドのカプセル化] によって、カプセル化するフィールドのアクセス修飾子が private に変更され、そのフィールドの get アクセサーおよび set アクセサーが生成されます。フィールドが読み取り専用で宣言されている場合など、get アクセサーだけが生成されることもあります。
リファクタリング エンジンでは、[フィールドのカプセル化] ダイアログ ボックスの [参照の更新] セクションで指定した領域について、新規プロパティへの参照に基づいてコードが更新されます。
フィールドからプロパティを作成するには
EncapsulateFieldExample という名前のコンソール アプリケーションを作成し、Program を次のプログラム例で置き換えます。
class Square { // Select the word 'width' and then use Encapsulate Field. public int width, height; } class MainClass { public static void Main() { Square mySquare = new Square(); mySquare.width = 110; mySquare.height = 150; // Output values for width and height. Console.WriteLine("width = {0}", mySquare.width); Console.WriteLine("height = {0}", mySquare.height); } }
コード エディター でカプセル化するフィールドの名前に宣言にカーソルを移動します。次の例では、カーソルを width という語に移動します。
public int width, height;
[リファクター] メニューの [フィールドのカプセル化] をクリックします。
[フィールドのカプセル化] ダイアログ ボックスが表示されます。
キーボード ショートカットとして、Ctrl キーを押しながら R キーを押し、次に Ctrl キーを押しながら E キーを押すことでも、[フィールドのカプセル化] ダイアログ ボックスを表示できます。
[フィールドのカプセル化] ダイアログ ボックスを表示するには、カーソルを右クリックし、[リファクター] をポイントして、[フィールドのカプセル化] をクリックする方法もあります。
設定を指定します。
Enter キーを押すか、[OK] をクリックします。
[参照の変更のプレビュー] を選択した場合は、[参照の変更のプレビュー] ウィンドウが表示されます。[適用] をクリックします。
次の get アクセサー コードおよび set アクセサー コードがソース ファイルに表示されます。
public int Width { get { return width; } set { width = value; } }
Main メソッドのコードも、新しい Width プロパティ名で更新されます。
Square mySquare = new Square(); mySquare.Width = 110; mySquare.height = 150; // Output values for width and height. Console.WriteLine("width = {0}", mySquare.Width);
解説
[フィールドのカプセル化] は、カーソルがフィールド宣言と同じ行にある場合だけ利用できます。
複数のフィールドが宣言されている宣言では、[フィールドのカプセル化] はコンマをフィールド間の区切り文字として使用し、カーソルに最も近く、カーソルと同じ行にあるフィールドのリファクタリングを開始します。宣言でフィールドの名前を選択することで、カプセル化するフィールドを指定することもできます。
このリファクタリング操作によって生成されるコードは、[フィールドのカプセル化] コード スニペット機能でモデル化されています。コード スニペットは変更できます。詳細については、「コード スニペット」を参照してください。