익명 형식 정의(Visual Basic)
익명 형식의 인스턴스 선언에 대한 응답으로 컴파일러는 형식에 대해 지정된 속성을 포함하는 새 클래스 정의를 만듭니다.
컴파일러 생성 코드
다음 product
정의의 경우 컴파일러는 Name
, Price
, OnHand
속성을 포함하는 새 클래스 정의를 만듭니다.
' Variable product is an instance of an anonymous type.
Dim product = New With {Key .Name = "paperclips", Key .Price = 1.29, .OnHand = 24}
클래스 정의에는 다음과 유사한 속성 정의가 포함되어 있습니다. 키 속성에 대한 Set
메서드는 없습니다. 키 속성의 값은 읽기 전용입니다.
Public Class $Anonymous1
Private _name As String
Private _price As Double
Private _onHand As Integer
Public ReadOnly Property Name() As String
Get
Return _name
End Get
End Property
Public ReadOnly Property Price() As Double
Get
Return _price
End Get
End Property
Public Property OnHand() As Integer
Get
Return _onHand
End Get
Set(ByVal Value As Integer)
_onHand = Value
End Set
End Property
End Class
또한 익명 형식 정의에는 매개 변수가 없는 생성자가 포함됩니다. 매개 변수가 필요한 생성자는 허용되지 않습니다.
익명 형식 선언에 하나 이상의 키 속성이 포함된 경우 형식 정의는 Object에서 상속된 세 개의 멤버를 재정의합니다.: Equals, GetHashCode, ToString. 선언된 키 속성이 없으면 ToString이 재정의됩니다. 재정의는 다음 기능을 제공합니다.
두 익명 형식 인스턴스가 동일한 인스턴스이거나 다음 조건을 충족하는 경우
Equals
는True
를 반환합니다.속성 수는 동일합니다.
속성은 동일한 이름과 동일한 유추 형식을 사용하여 동일한 순서로 선언됩니다. 이름 비교는 대/소문자를 구분하지 않습니다.
하나 이상의 속성이 키 속성이며
Key
키워드가 동일한 속성에 적용됩니다.각 해당 키 속성 쌍을 비교하면
True
가 반환됩니다.예를 들어 다음 예제에서는
Equals
은employee01
및employee08
에 대해서만True
를 반환합니다. 각 줄 앞의 주석은 새 인스턴스가employee01
과 일치하지 않는 이유를 지정합니다.Dim employee01 = New With {Key .Name = "Bob", Key .Category = 3, .InOffice = False} ' employee02 has no InOffice property. Dim employee02 = New With {Key .Name = "Bob", Key .Category = 3} ' The first property has a different name. Dim employee03 = New With {Key .FirstName = "Bob", Key .Category = 3, .InOffice = False} ' Property Category has a different value. Dim employee04 = New With {Key .Name = "Bob", Key .Category = 2, .InOffice = False} ' Property Category has a different type. Dim employee05 = New With {Key .Name = "Bob", Key .Category = 3.2, .InOffice = False} ' The properties are declared in a different order. Dim employee06 = New With {Key .Category = 3, Key .Name = "Bob", .InOffice = False} ' Property Category is not a key property. Dim employee07 = New With {Key .Name = "Bob", .Category = 3, .InOffice = False} ' employee01 and employee 08 meet all conditions for equality. Note ' that the values of the non-key field need not be the same. Dim employee08 = New With {Key .Name = "Bob", Key .Category = 2 + 1, .InOffice = True} ' Equals returns True only for employee01 and employee08. Console.WriteLine(employee01.Equals(employee08))
GetHashcode
는 적절하게 고유한 GetHashCode 알고리즘을 제공합니다. 알고리즘은 키 속성만 사용하여 해시 코드를 계산합니다.ToString
는 다음 예제와 같이 연결된 속성 값의 문자열을 반환합니다. 키 속성과 키가 아닌 속성이 모두 포함됩니다.Console.WriteLine(employee01.ToString()) Console.WriteLine(employee01) ' The preceding statements both display the following: ' { Name = Bob, Category = 3, InOffice = False }
익명 형식의 명시적으로 명명된 속성은 생성된 메서드와 충돌할 수 없습니다. 즉, .Equals
, .GetHashCode
, .ToString
을 사용하여 속성 이름을 지정할 수 없습니다.
하나 이상의 키 속성을 포함하는 익명 형식 정의는 T
가 익명 형식의 형식인 System.IEquatable<T> 인터페이스도 구현합니다.
참고 항목
익명 형식 선언은 동일한 어셈블리에서 발생하고 속성의 이름과 유추된 형식이 같고, 속성이 동일한 순서로 선언되고 동일한 속성이 키 속성으로 표시되는 경우에만 동일한 익명 형식을 만듭니다.
참고 항목
.NET