次の方法で共有


で。。。End With ステートメント (Visual Basic)

1 つのオブジェクトまたは構造体を繰り返し参照する一連のステートメントを実行して、オブジェクトまたは構造体のメンバーにアクセスするときにステートメントで簡略化された構文を使用できるようにします。 構造体を使用する場合、メンバーの値の読み取りまたはメソッドの呼び出しのみが可能で、 With...End With ステートメントで使用される構造体のメンバーに値を割り当てようとするとエラーが発生します。

構文

With objectExpression
    [ statements ]
End With

部品

任期 定義
objectExpression 必須。 オブジェクトに評価される式。 式は任意に複雑な場合があり、1 回だけ評価されます。 式は、基本型を含む任意のデータ型に評価できます。
statements 任意。 objectExpressionの評価によって生成されるオブジェクトのメンバーを参照できる、WithEnd 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

こちらも参照ください