With...End With ステートメント (Visual Basic)
更新 : 2007 年 11 月
オブジェクトや構造体への参照を繰り返し指定する、一連のステートメントを実行します。
With object
[ statements ]
End With
指定項目
object
必ず指定します。変数または式です。基本データ型だけでなく、どのデータ型として評価される式でも指定できます。statements
省略可能です。object に対して実行される 1 つ以上のステートメントを、With と End With の間に定義します。End With
必ず指定します。With ブロックの定義を終了します。
解説
With...End With ステートメントを使用すると、特定のオブジェクトの名前を再定義することなく、そのオブジェクトに対して一連のステートメントを実行できます。オブジェクトの修飾パスが長い場合は、With...End With を使用してパフォーマンスを高めることができます。また、With ブロックを使うと修飾パスを何度も入力する必要がないため、入力を誤る可能性が低くなります。
たとえば、単一のオブジェクトに対して複数の異なるプロパティを変更する場合、プロパティを割り当てるステートメントを With...End With 内に指定すると、プロパティを割り当てるたびにオブジェクトを参照するのではなく、一度参照するだけで済みます。
規則
データ型object のデータ型には、任意のクラス型や構造体の型、または Visual Basic の基本型 (Integer など) も使用できます。.NET Framework ではすべての基本型をクラスまたは構造体に使用でき、そのメンバには With ブロックの内部からアクセスできます。
宣言object は、With ブロックの前に宣言する必要があります。With ステートメントの中には宣言できません。
反復の回数With ブロックは反復処理を行うブロックではありません。ブロックの内部にループがなければ、ステートメントは一度だけ実行されます。
入れ子構造With...End With は入れ子構造にできます。つまり、With...End With の内部に別の With...End With を入れることができます。カスタマイズ例については、「方法 : オブジェクトに対して複数のアクションを実行する」を参照してください。
ただし、外側のステートメントのメンバは内側のステートメントに対してはマスクされているので、外側の With ブロックに含まれているオブジェクトのメンバを参照するときは、内側の With でオブジェクト参照を完全に修飾する必要があります。
また、さまざまな種類の制御構造を入れ子にすることもできます。詳細については、「入れ子になった制御構造」を参照してください。
**制御の転送。**Visual Basic では、Exit ステートメント (Visual Basic) を使用して制御を With ブロックの外部に転送できません。すべてのステートメントを実行し終える前に終了するには、End With ステートメントにラベルを設定し、GoTo ステートメントを使用してそのラベルに分岐します。詳細については、「方法 : ステートメントへのラベル付け」を参照してください。
制御を With ブロックの外部から内部に転送したり、内部から外部に転送したりすることはできません。ブロックの内部からプロシージャを呼び出すことは可能ですが、制御はその次のステートメントに戻ります。
**他のオブジェクトへのアクセス。**With ブロックに入ったら、End With ステートメントを通過するまで object を割り当て直すことはできません。このため、修飾せずにアクセスできるのは、指定したオブジェクトのメソッドやプロパティだけです。他のオブジェクトのメソッドやプロパティを使用するには、オブジェクト名で修飾する必要があります。
使用例
次の例は、With ブロックを使用して、単一のオブジェクトに対する一連のステートメントを実行します。この例では testObject オブジェクトが既に作成済みで、参照されるプロパティを公開している必要があります。
With testObject
.Height = 100
.Text = "Hello, World"
.ForeColor = System.Drawing.Color.Green
.Font = New System.Drawing.Font(.Font, _
System.Drawing.FontStyle.Bold)
End With
オブジェクト初期化子における With キーワード
Visual Basic 2008 では、オブジェクト初期化子の中に、With キーワードが新たに採用されています。使用例を含む詳細については、「オブジェクト初期化子 : 名前付きの型と匿名型」および「匿名型」を参照してください。