다음을 통해 공유


개체 이니셜라이저: 명명된 형식 및 익명 형식(Visual Basic)

개체 이니셜라이저를 사용하면 단일 식을 사용하여 복합 개체의 속성을 지정할 수 있습니다. 명명된 형식 및 익명 형식의 인스턴스를 만드는 데 사용할 수 있습니다.

선언

명명된 형식과 익명 형식의 인스턴스 선언은 거의 동일하게 보일 수 있지만 그 효과는 동일하지 않습니다. 각 범주에는 고유한 기능과 제한이 있습니다. 다음 예제에서는 개체 이니셜라이저 목록을 사용하여 명명된 클래스 Customer의 인스턴스를 선언하고 초기화하는 편리한 방법을 보여 줍니다. 클래스의 이름은 키워드 New다음에 지정됩니다.

Dim namedCust = New Customer With {.Name = "Terry Adams"}

익명 형식에는 사용할 수 있는 이름이 없습니다. 따라서 익명 형식의 인스턴스화에는 클래스 이름을 포함할 수 없습니다.

Dim anonymousCust = New With {.Name = "Hugo Garcia"}

두 선언의 요구 사항 및 결과는 동일하지 않습니다. namedCust 속성이 있는 Customer 클래스는 이미 존재해야 하고, 선언은 그 클래스의 인스턴스를 생성합니다. 예를 anonymousCust들어 컴파일러는 하나의 속성, 즉 문자열이 있는 Name새 클래스를 정의하고 해당 클래스의 새 인스턴스를 만듭니다.

명명된 유형

개체 이니셜라이저는 형식의 생성자를 호출한 다음 단일 문에서 일부 또는 모든 속성의 값을 설정하는 간단한 방법을 제공합니다. 컴파일러는 인수가 없는 경우 매개 변수가 없는 생성자, 하나 이상의 인수가 전송되는 경우 매개 변수가 있는 생성자 등 문에 대한 적절한 생성자를 호출합니다. 그런 다음 지정된 속성이 이니셜라이저 목록에 표시되는 순서대로 초기화됩니다.

이니셜라이저 목록의 각 초기화는 클래스의 멤버에 초기 값을 할당하는 것으로 구성됩니다. 멤버의 이름과 데이터 형식은 클래스가 정의되면 결정됩니다. 다음 예제에서는 클래스가 Customer 있어야 하며 이름이 지정된 Name 멤버가 있어야 하며 City 문자열 값을 수락할 수 있습니다.

Dim cust0 As Customer = New Customer With {.Name = "Toni Poe", 
                                           .City = "Louisville"}

또는 다음 코드를 사용하여 동일한 결과를 얻을 수 있습니다.

Dim cust1 As New Customer With {.Name = "Toni Poe", 
                                .City = "Louisville"}

이러한 각 선언은 매개 변수가 없는 생성자를 사용하여 Customer 오브젝트를 생성하고, Name 문을 사용하여 CityWith 속성의 초기 값을 지정하는 다음 예제와 동일합니다.

Dim cust2 As New Customer()
With cust2
    .Name = "Toni Poe"
    .City = "Louisville"
End With

예를 들어 클래스에 Customer 대한 Name값을 보낼 수 있는 매개 변수가 있는 생성자가 포함된 경우 다음과 같은 방법으로 개체를 Customer 선언하고 초기화할 수도 있습니다.

Dim cust3 As Customer = 
    New Customer("Toni Poe") With {.City = "Louisville"}
' --or--
Dim cust4 As New Customer("Toni Poe") With {.City = "Louisville"}

다음 코드와 같이 모든 속성을 초기화할 필요는 없습니다.

Dim cust5 As Customer = New Customer With {.Name = "Toni Poe"}

그러나 초기화 목록은 비워 둘 수 없습니다. 초기화되지 않은 속성은 기본값을 유지합니다.

명명된 형식을 사용하여 형식 유추

개체 이니셜라이저와 로컬 형식 유추를 결합하여 선언 cust1 에 대한 코드를 줄일 수 있습니다. 이렇게 하면 변수 선언에서 절을 As 생략할 수 있습니다. 변수의 데이터 형식은 할당에 의해 만들어진 개체의 형식에서 유추됩니다. 다음 예제에서 cust6의 형식은 Customer입니다.

Dim cust6 = New Customer With {.Name = "Toni Poe", 
                               .City = "Louisville"}

명명된 형식에 대한 설명

  • 개체 이니셜라이저 목록에서 클래스 멤버를 두 번 이상 초기화할 수 없습니다. 선언이 cust7 오류를 발생시킵니다.

    '' This code does not compile because Name is initialized twice.
    ' Dim cust7 = New Customer With {.Name = "Toni Poe", 
    '                                .City = "Louisville",
    '                                .Name = "Blue Yonder Airlines"}
    
  • 멤버를 사용하여 자체 또는 다른 필드를 초기화할 수 있습니다. 다음 선언 cust8과 같이 멤버가 초기화되기 전에 액세스하는 경우 기본값이 사용됩니다. 개체 이니셜라이저를 사용하는 선언이 처리될 때 가장 먼저 발생하는 일은 적절한 생성자가 호출된다는 것입니다. 그런 다음 이니셜라이저 목록의 개별 필드가 초기화됩니다. 다음 예제에서는 Name에 기본값이 할당되고, cust8에는 초기화된 값이 할당됩니다.

    Dim cust8 = New Customer With {.Name = .Name & ", President"}
    Dim cust9 = New Customer With {.Name = "Toni Poe", 
                                   .Title = .Name & ", President"}
    

    다음 예제에서는 cust3cust4의 매개변수 생성자를 사용하여 cust10cust11를 선언하고 초기화합니다.

    Dim cust10 = New Customer("Toni Poe") With {.Name = .Name & ", President"}
    ' --or--
    Dim cust11 As New Customer("Toni Poe") With {.Name = .Name & ", President"}
    
  • 개체 이니셜라이저를 중첩할 수 있습니다. 다음 예제 AddressClass 에서는 두 개의 속성 City 이 있는 클래스이며 StateCustomer 클래스에는 인스턴스AddressAddressClass 속성이 있습니다.

    Dim cust12 = 
        New Customer With {.Name = "Toni Poe", 
                           .Address = 
                               New AddressClass With {.City = "Louisville", 
                                                      .State = "Kentucky"}}
    Console.WriteLine(cust12.Address.State)
    
  • 초기화 목록은 비워 둘 수 없습니다.

  • 초기화되는 인스턴스는 Object 형식일 수 없습니다.

  • 초기화되는 클래스 멤버는 공유 멤버, 읽기 전용 멤버, 상수 또는 메서드 호출일 수 없습니다.

  • 초기화되는 클래스 멤버는 인덱싱하거나 정규화할 수 없습니다. 다음 예제에서는 컴파일러 오류를 발생합니다.

    '' Not valid.

    ' Dim c1 = New Customer With {.OrderNumbers(0) = 148662}

    ' Dim c2 = New Customer with {.Address.City = "Springfield"}

무명 형식

익명 형식은 개체 이니셜라이저를 사용하여 명시적으로 정의하고 이름을 지정하지 않는 새 형식의 인스턴스를 만듭니다. 대신, 컴파일러는 개체 이니셜라이저 목록에서 지정한 속성에 따라 형식을 생성합니다. 형식의 이름이 지정되지 않았으므로 익명 형식이라고 합니다. 예를 들어 다음 선언을 앞의 cust6선언과 비교합니다.

Dim cust13 = New With {.Name = "Toni Poe", 
                       .City = "Louisville"}

구문적으로 유일한 차이점은 데이터 형식 뒤에 이름을 지정하지 않는다는 것입니다. 그러나 어떤 일이 일어나는지는 매우 다릅니다. 컴파일러는 두 개의 속성을 Name 가진 새 익명 형식을 정의하고 City지정된 값을 사용하여 해당 형식의 인스턴스를 만듭니다. 형식 유추는 예제의 Name 형식과 City 문자열 형식을 결정합니다.

주의

익명 형식의 이름은 컴파일러에서 생성되며 컴파일마다 다를 수 있습니다. 코드는 익명 타입의 이름을 사용하거나 의존해서는 안 됩니다.

형식 이름을 사용할 수 없기 때문에 Ascust13를 선언할 수 없습니다. 해당 형식을 유추해야 합니다. 지연 바인딩을 사용하지 않으면 익명 형식의 사용을 지역 변수로 제한합니다.

익명 형식은 LINQ 쿼리에 대한 중요한 지원을 제공합니다. 쿼리에서 익명 형식을 사용하는 방법에 대한 자세한 내용은 Visual Basic의 익명 형식LINQ 소개를 참조하세요.

익명 형식에 대한 설명

  • 일반적으로 익명 형식 선언에 있는 속성의 전부 또는 대부분은 키 속성으로, 속성 이름 앞에 키워드 Key 를 입력하여 표시됩니다.

    
    Dim anonymousCust1 = New With {Key .Name = "Hugo Garcia", 
                                   Key .City = "Louisville"}
    

    키 속성에 대한 자세한 내용은 키를 참조 하세요.

  • 명명된 형식과 마찬가지로 익명 형식 정의에 대한 이니셜라이저 목록은 하나 이상의 속성을 선언해야 합니다.

    Dim anonymousCust = New With {.Name = "Hugo Garcia"}
    
  • 익명 형식의 인스턴스가 선언되면 컴파일러는 일치하는 익명 형식 정의를 생성합니다. 속성의 이름 및 데이터 형식은 인스턴스 선언에서 가져와 정의에 컴파일러에 의해 포함됩니다. 속성은 명명된 형식에 대한 속성이므로 미리 명명되고 정의되지 않습니다. 해당 형식은 유추됩니다. 절을 사용하여 As 속성의 데이터 형식을 지정할 수 없습니다.

  • 익명 형식은 여러 가지 다른 방법으로 해당 속성의 이름과 값을 설정할 수도 있습니다. 예를 들어 익명 형식 속성은 변수의 이름과 값 또는 다른 개체의 속성 이름과 값을 모두 사용할 수 있습니다.

    ' Create a variable, Name, and give it an initial value.
    Dim Name = "Hugo Garcia"
    
    ' Variable anonymousCust2 will have one property, Name, with 
    ' "Hugo Garcia" as its initial value.
    Dim anonymousCust2 = New With {Key Name}
    
    ' The next declaration uses a property from namedCust, defined
    ' in an earlier example. After the declaration, anonymousCust3 will
    ' have one property, Name, with "Terry Adams" as its value.
    Dim anonymousCust3 = New With {Key namedCust.Name}
    

    익명 형식의 속성을 정의하는 옵션에 대한 자세한 내용은 방법: 익명 형식 선언에서 속성 이름 및 형식 유추를 참조하세요.

참고하십시오