다음을 통해 공유


익명 형식 정의(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이 재정의됩니다. 재정의는 다음 기능을 제공합니다.

  • 두 익명 형식 인스턴스가 동일한 인스턴스이거나 다음 조건을 충족하는 경우 EqualsTrue를 반환합니다.

    • 속성 수는 동일합니다.

    • 속성은 동일한 이름과 동일한 유추 형식을 사용하여 동일한 순서로 선언됩니다. 이름 비교는 대/소문자를 구분하지 않습니다.

    • 하나 이상의 속성이 키 속성이며 Key 키워드가 동일한 속성에 적용됩니다.

    • 각 해당 키 속성 쌍을 비교하면 True가 반환됩니다.

      예를 들어 다음 예제에서는 Equalsemployee01employee08에 대해서만 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> 인터페이스도 구현합니다.

참고 항목

익명 형식 선언은 동일한 어셈블리에서 발생하고 속성의 이름과 유추된 형식이 같고, 속성이 동일한 순서로 선언되고 동일한 속성이 키 속성으로 표시되는 경우에만 동일한 익명 형식을 만듭니다.

참고 항목