다음을 통해 공유


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

업데이트: 2007년 11월

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

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

익명 형식의 속성 이름과 형식도 다른 소스에서 유추할 수 있습니다. 다음 단원에서는 유추가 가능한 상황을 나열하고 그렇지 않은 상황의 예를 제공합니다.

성공적인 유추

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

  • 변수 이름. 익명 형식 anonProduct는 name과 price라는 두 개의 속성을 가집니다. 이러한 속성의 데이터 속성은 각각 원래 변수 String 및 Double 형식이 됩니다.

    Dim productName As String = "paperclips"
    Dim productPrice As Double = 1.29
    Dim anonPproduct = New With {Key productName, Key productPrice}
    
    ' To create uppercase variable names for the new properties,
    ' assign variables productName and productPrice to uppercase identifiers.
    Dim anonPproduct1 = New With {Key .Name = productName, Key .Price = productPrice}
    
  • 다른 개체의 속성 또는 필드 이름. 예를 들어 Name 및 ID 속성을 포함하는 CarClass 형식의 car 개체를 가정해 봅니다. 해당 Name 및 ID 속성이 car 개체의 값으로 초기화된 새 익명 형식 인스턴스 car1을 만들려면 다음과 같이 작성할 수 있습니다.

    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의 결과 형식은 XElement의 IEnumerable 형식인 Book이라는 한 개의 속성을 가집니다.

  • 다음 예제의 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.Name 및 car1.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의 멤버 이름과 동일한 경우. 예를 들어 다음 선언은 Equals가 Object의 메서드이기 때문에 실패합니다.

    ' 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"}
    

참고 항목

작업

방법: 익명 형식의 인스턴스 선언

개념

개체 이니셜라이저: 명명된 형식과 익명 형식

지역 형식 유추

익명 형식

명명된 형식과 익명 형식 비교

참조

Key(Visual Basic)