다음을 통해 공유


와... End with 문(Visual Basic)

개체 또는 구조체의 멤버에 액세스할 때 문이 간소화된 구문을 사용할 수 있도록 단일 개체 또는 구조를 반복적으로 참조하는 일련의 문을 실행합니다.

문법

With objectExpression
    [ statements ]
End With

부분

기간 정의
objectExpression 필수 사항입니다. 개체로 계산되는 식입니다. 식은 임의로 복잡할 수 있으며 한 번만 계산됩니다. 식은 기본 형식을 포함하여 모든 데이터 형식으로 계산할 수 있습니다.
statements 선택 사항입니다. 평가With에서 생성되는 개체의 멤버를 참조할 수 있는 하나 이상의 문과 End WithobjectExpression 사이에 있는 문
End With 필수 사항입니다. 블록의 정의를 종료합니다 With .

비고

사용하면 With...End With개체의 이름을 여러 번 지정하지 않고 지정된 개체에 대해 일련의 문을 수행할 수 있습니다. With 문 블록 내에서 문 개체가 마침표 앞에 오는 것처럼 마침표로 시작하는 개체의 멤버를 With 지정할 수 있습니다.

예를 들어 단일 개체에서 여러 속성을 변경하려면 각 속성 할당에 대해 한 번만이 아니라 개체를 한 번만 참조하여 블록 내부에 With...End With 속성 할당 문을 배치합니다.

코드가 여러 문에서 동일한 개체에 액세스하는 경우 문을 사용하여 With 다음과 같은 이점을 얻을 수 있습니다.

  • 복잡한 식을 여러 번 평가하거나 임시 변수에 결과를 할당하여 멤버를 여러 번 참조할 필요가 없습니다.

  • 반복적인 정규화 식을 제거하여 코드를 더 읽기 쉽게 만듭니다.

데이터 형식 objectExpression 은 모든 클래스 또는 구조체 형식이거나 Visual Basic 기본 형식(예: Integer.)일 수 있습니다. 구조체인 경우 objectExpression 해당 멤버에 할당하는 기능은 구조체 식을 참조할 수 있는지 여부에 따라 달라집니다. 직접 참조할 수 있는 구조체의 멤버(예: 변수, 배열 요소 또는 필드)에 할당할 수 있지만 함수, 속성 또는 연산자에서 값으로 반환되는 구조체의 멤버에 값을 할당하려고 하거나 참조 관계를 With (structureVariable)잘라내는 데 괄호를 사용하는 경우 오류가 발생합니다. 구조체를 반환하고 함수 결과의 멤버에 값을 즉시 액세스하고 할당하는 메서드를 호출하면 다음과 같은 GetAPoint().x = 1오류가 발생합니다. 두 경우 모두 구조체가 호출 스택에만 존재하며 이러한 상황에서 수정된 구조체 멤버가 프로그램의 다른 코드에서 변경 내용을 관찰할 수 있도록 위치에 쓸 수 있는 방법이 없다는 것입니다.

objectExpression 블록에 들어갈 때 한 번 평가됩니다. 블록 내에서 objectExpression 는 다시 할당할 With 수 없습니다.

With 블록 내에서 지정된 개체의 메서드 및 속성만 한정하지 않고 액세스할 수 있습니다. 다른 개체의 메서드와 속성을 사용할 수 있지만 해당 개체 이름으로 한정해야 합니다.

With...End With 문을 다른 문 내에 배치할 수 있습니다. With...End With 참조되는 개체가 컨텍스트에서 명확하지 않은 경우 중첩된 문이 혼동될 수 있습니다. 개체가 내부 With 블록 내에서 참조될 때 외부 With 블록에 있는 개체에 대한 정규화된 참조를 제공해야 합니다.

블록 외부에서 문 블록으로 With 분기할 수 없습니다.

블록에 루프가 포함되지 않는 한 문은 한 번만 실행됩니다. 다양한 종류의 컨트롤 구조를 중첩할 수 있습니다. 자세한 내용은 중첩된 컨트롤 구조를 참조하세요.

비고

개체 이 With 니셜라이저에서도 키워드를 사용할 수 있습니다. 자세한 내용 및 예제는 개체 이니셜라이저: 명명된 형식 및 익명 형식익명 형식을 참조하세요.

블록을 사용하여 방금 인스턴스화한 With 개체의 속성 또는 필드를 초기화하는 경우 대신 개체 이니셜라이저를 사용하는 것이 좋습니다.

예제 1

다음 예제에서 각 With 블록은 단일 개체에 대해 일련의 문을 실행합니다.

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

예제 3

다음 예제에서는 문이 구조체에서 작동하는 방법을 With...End With 보여 줍니다. 참조 가능한 구조체(예: 배열 요소)의 멤버에 할당할 수 있지만 값으로 반환되거나 괄호를 사용할 때 반환되는 구조에는 할당할 수 없습니다.

Private Sub DemonstrateStructureWithStatement()
    ' Create an array of structures - this is referenceable
    Dim points(2) As Point

    ' Valid: Array elements are referenceable, so assignments work
    With points(0)
        .X = 10
        .Y = 20
    End With

    ' Create a single structure variable - this is also referenceable
    Dim singlePoint As Point
    With singlePoint
        .X = 30
        .Y = 40
    End With

    ' Invalid: Using parentheses cuts reference ties
    ' With (points(0))
    '     .X = 50  ' This would cause BC30068 error
    '     .Y = 60
    ' End With

    ' Invalid: Function returns by value, not referenceable
    ' With GetPoint()
    '     .X = 70  ' This would cause BC30068 error
    '     .Y = 80
    ' End With
End Sub

Private Function GetPoint() As Point
    Return New Point With {.X = 1, .Y = 2}
End Function

Private Structure Point
    Public X As Integer
    Public Y As Integer
End Structure

참고하십시오