방법: 익명 형식 선언에서 속성 이름 및 형식 유추
업데이트: 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"}