1 つのオブジェクトまたは構造体を繰り返し参照する一連のステートメントを実行して、オブジェクトまたは構造体のメンバーにアクセスするときにステートメントで簡略化された構文を使用できるようにします。 構造体を使用する場合、メンバーの値の読み取りまたはメソッドの呼び出しのみが可能で、 With...End With
ステートメントで使用される構造体のメンバーに値を割り当てようとするとエラーが発生します。
構文
With objectExpression
[ statements ]
End With
部品
任期 | 定義 |
---|---|
objectExpression |
必須。 オブジェクトに評価される式。 式は任意に複雑な場合があり、1 回だけ評価されます。 式は、基本型を含む任意のデータ型に評価できます。 |
statements |
任意。
objectExpression の評価によって生成されるオブジェクトのメンバーを参照できる、With とEnd With の間の 1 つ以上のステートメント。 |
End With |
必須。
With ブロックの定義を終了します。 |
注釈
With...End With
を使用すると、オブジェクトの名前を複数回指定せずに、指定したオブジェクトに対して一連のステートメントを実行できます。
With
ステートメント ブロック内では、With
ステートメント オブジェクトの前にあるかのように、ピリオドで始まるオブジェクトのメンバーを指定できます。
たとえば、1 つのオブジェクトで複数のプロパティを変更するには、プロパティ割り当てステートメントを With...End With
ブロック内に配置し、プロパティの割り当てごとに 1 回ではなく 1 回だけオブジェクトを参照します。
コードが複数のステートメントで同じオブジェクトにアクセスする場合は、 With
ステートメントを使用して次の利点を得ることができます。
複合式を複数回評価したり、結果を一時変数に代入してメンバーを複数回参照したりする必要はありません。
繰り返し修飾式を排除することで、コードをより読みやすくします。
objectExpression
のデータ型には、任意のクラスまたは構造体の型、または visual Basic の基本型 (Integer
など) を指定できます。
objectExpression
オブジェクト以外の値が発生した場合、そのメンバーの値の読み取りまたはメソッドの呼び出しのみが可能であり、With...End With
ステートメントで使用される構造体のメンバーに値を割り当てようとするとエラーが発生します。 これは、構造体を返し、すぐにアクセスして、 GetAPoint().x = 1
などの関数の結果のメンバーに値を割り当てたメソッドを呼び出した場合に発生するのと同じエラーです。 どちらの場合も問題は、構造体が呼び出し履歴にのみ存在し、このような状況で変更された構造体メンバーがプログラム内の他のコードが変更を観察できるように場所に書き込むことができる方法がないということです。
objectExpression
は、ブロックに入ると 1 回評価されます。
With
ブロック内からobjectExpression
を再割り当てすることはできません。
With
ブロック内では、指定したオブジェクトのメソッドとプロパティに限定せずにアクセスできます。 他のオブジェクトのメソッドとプロパティを使用できますが、オブジェクト名で修飾する必要があります。
1 つの With...End With
ステートメントを別のステートメント内に配置できます。 入れ子になった With...End With
ステートメントは、参照されているオブジェクトがコンテキストから明確でない場合、混乱を招く可能性があります。 オブジェクトが内部With
ブロック内から参照されている場合は、外側のWith
ブロック内にあるオブジェクトへの完全修飾参照を指定する必要があります。
ブロックの外側から With
ステートメント ブロックに分岐することはできません。
ブロックにループが含まれている場合を除き、ステートメントは 1 回だけ実行されます。 さまざまな種類のコントロール構造を入れ子にすることができます。 詳細については、「ネストされたコントロール構造」を参照してください。
注
With
キーワードは、オブジェクト初期化子でも使用できます。 詳細と例については、「 オブジェクト初期化子: 名前付き型と匿名型と匿名型 」を参照 してください。
インスタンス化したオブジェクトのプロパティまたはフィールドのみを初期化するために With
ブロックを使用している場合は、代わりにオブジェクト初期化子を使用することを検討してください。
例 1
次の例では、各 With
ブロックは、1 つのオブジェクトに対して一連のステートメントを実行します。
Private Sub AddCustomer()
Dim theCustomer As New Customer
With theCustomer
.Name = "Coho Vineyard"
.URL = "http://www.cohovineyard.com/"
.City = "Redmond"
End With
With theCustomer.Comments
.Add("First comment.")
.Add("Second comment.")
End With
End Sub
Public Class Customer
Public Property Name As String
Public Property City As String
Public Property URL As String
Public Property Comments As New List(Of String)
End Class
例 2
次の例では、ステートメント With…End With
入れ子にしています。 入れ子になった With
ステートメント内では、構文は内部オブジェクトを参照します。
Dim theWindow As New EntryWindow
With theWindow
With .InfoLabel
.Content = "This is a message."
.Foreground = Brushes.DarkSeaGreen
.Background = Brushes.LightYellow
End With
.Title = "The Form Title"
.Show()
End With
こちらも参照ください
.NET