다음을 통해 공유


방법: 익명 형식 선언에서 속성 이름 및 형식 유추(Visual Basic)

익명 형식은 속성의 데이터 형식을 직접 지정하는 메커니즘을 제공하지 않습니다. 모든 속성의 형식이 유추됩니다. 다음 예제에서 NamePrice 의 형식은 이를 초기화하는 데 사용되는 값에서 직접 유추됩니다.

' Variable product is an instance of a simple anonymous type.
Dim product = New With {Key .Name = "paperclips", .Price = 1.29}

익명 형식은 다른 소스에서 속성 이름 및 형식을 유추할 수도 있습니다. 다음 섹션에서는 유추가 가능한 환경의 목록과 유추가 가능하지 않은 상황의 예를 제공합니다.

유추 성공

익명 형식은 다음 소스에서 속성 이름 및 형식을 유추할 수 있습니다.

  • 변수 이름에서. 익명 형식 anonProduct 에는 두 개의 속성 productNameproductPrice가 있습니다. 각각의 데이터 형식은 원래 변수 StringDouble의 데이터 형식입니다.

    Dim productName As String = "paperclips"
    Dim productPrice As Double = 1.29
    Dim anonProduct = New With {Key productName, Key productPrice}
    
    ' To create uppercase variable names for the new properties,
    ' assign variables productName and productPrice to uppercase identifiers.
    Dim anonProduct1 = New With {Key .Name = productName, Key .Price = productPrice}
    
  • 다른 개체의 속성 또는 필드 이름에서. carCarClass 속성이 포함된 Name 형식의 ID 개체를 예로 들겠습니다. car1개체의 값으로 초기화되는 NameID 속성을 가진 새 익명 형식 인스턴스 car 을 만들려면 다음을 작성할 수 있습니다.

    Dim car1 = New With {Key car.Name, Key car.ID}
    

    이전 선언은 익명 형식 car2를 정의하는 더 긴 코드 줄과 동일합니다.

    Dim car2 = New With {Key .Name = car.Name, Key .ID = car.ID}
    
  • XML 멤버 이름에서.

    Dim books = <Books>
                    <Book Author="Jesper Aaberg">
                        Advanced Programming Methods
                    </Book>
                </Books>
    Dim anon = New With {books...<Book>}
    

    anon 의 결과 형식은 Book(Of XElement) 형식의 IEnumerable속성 하나를 가집니다.

  • 다음 예제에서처럼 SomeFunction 과 같은 매개 변수가 없는 함수에서.

    Dim sc As New SomeClass
    Dim anon1 = New With {Key sc.SomeFunction()}
    

    다음 코드에서 변수 anon2 은 하나의 속성(이름이 First인 문자)을 가지는 익명 형식입니다. 이 코드는 함수 First에서 반환하는 문자인 “E”를 표시합니다.

    Dim aString As String = "Example String"
    Dim anon2 = New With {Key aString.First()}
    ' The variable anon2 has one property, First.
    Console.WriteLine(anon2.First)
    

유추 실패

다음을 포함한 여러 경우에 이름 유추가 실패합니다.

  • 인수가 필요한 메서드, 생성자 또는 매개 변수가 있는 속성의 호출에서 유추가 도출되는 경우. anon1 에 하나 이상의 인수가 있는 경우 someFunction 의 이전 선언이 실패합니다.

    ' Not valid.
    ' Dim anon3 = New With {Key sc.someFunction(someArg)}
    

    새 속성 이름에 할당하면 문제가 해결됩니다.

    ' Valid.
    Dim anon4 = New With {Key .FunResult = sc.someFunction(someArg)}
    
  • 복잡한 식에서 유추가 도출되는 경우.

    Dim aString As String = "Act "
    ' Not valid.
    ' Dim label = New With {Key aString & "IV"}
    

    식의 결과를 속성 이름에 할당하여 오류를 해결할 수 있습니다.

    ' Valid.
    Dim label1 = New With {Key .someLabel = aString & "IV"}
    
  • 이름이 동일한 둘 이상의 속성을 생성하는 여러 속성에 대한 유추. 이전 예의 선언을 다시 보면 product.Namecar1.Name 모두를 동일한 익명 형식의 속성으로 나열할 수 없습니다. 이는 이 두 가지 각각에 대한 유추된 식별자가 Name이기 때문입니다.

    ' Not valid.
    ' Dim anon5 = New With {Key product.Name, Key car1.Name}
    

    고유한 속성 이름에 값을 할당하여 문제를 해결할 수 있습니다.

    ' Valid.
    Dim anon6 = New With {Key .ProductName = product.Name, Key .CarName = car1.Name}
    

    대/소문자를 변경하더라도 두 이름이 고유해지지 않습니다.

    Dim price = 0
    ' Not valid, because Price and price are the same name.
    ' Dim anon7 = New With {Key product.Price, Key price}
    
  • 속성의 초기 형식 및 값이 아직 설정되지 않은 다른 속성에 따라 달라지는 경우. 예를 들어 .IDName = .LastName 이 아직 초기화되지 않은 경우 .LastName 은 익명 형식 선언에서 유효하지 않습니다.

    ' Not valid.
    ' Dim anon8 = New With {Key .IDName = .LastName, Key .LastName = "Jones"}
    

    이 예에서는 속성이 선언되는 순서를 반전시켜서 문제를 해결할 수 있습니다.

    ' Valid.
    Dim anon9 = New With {Key .LastName = "Jones", Key .IDName = .LastName}
    
  • 익명 형식의 속성 이름은 Object의 멤버 이름과 동일합니다. 예를 들어 EqualsObject의 메서드이므로 다음 선언은 실패합니다.

    ' Not valid.
    ' Dim relationsLabels1 = New With {Key .Equals = "equals", Key .Greater = _
    '                       "greater than", Key .Less = "less than"}
    

    속성 이름을 변경하여 문제를 해결할 수 있습니다.

    ' Valid 
    Dim relationsLabels2 = New With {Key .EqualString = "equals",
                                     Key .GreaterString = "greater than",
                                     Key .LessString = "less than"}
    

참고 항목