というわけで、その3です。ここのところのエントリ具合は決してスタンスを変えたとかってわけじゃないです。
少し日が空いたので、その2へリンク→Visual Basic 2008 の新機能 - 匿名型 その2(キー プロパティ) -
さて、匿名型はコンパイラによって生成されているらしいのですが、実際にはどんな感じになっているんでしょうねぇ。気になります。とても。
というわけでまずはここらあたりを見てみます。
- MSDN:匿名型の定義
- Visual Basic Language Specification 9.0 :「11.10.4 Anonymous Object-Creation Expressions
さくっとまとめてみると、
で、Visual Basic Language Specification 9.0に書かれているサンプルを元に、以下の匿名型がどう宣言されるのかを書いてみますと、
Dim member = New With {Key .ID = 76, .Name = "とりこびと"}
こんな感じっぽいです。↓
Imports System
Friend Class AnonymousType
Implements IEquatable(Of AnonymousType)
Private ReadOnly _id As Integer
Private _name As String
Public Sub New(ByVal id As Integer, ByVal name As String)
Me._id = id
Me._name = name
End Sub
Public ReadOnly Property ID() As Integer
Get
Return Me._id
End Get
End Property
Public Property Name() As String
Get
Return Me._name
End Get
Set(ByVal value As String)
Me._name = value
End Set
End Property
Public Overrides Function Equals(ByVal obj As Object) As Boolean
Dim other As AnonymousType = TryCast(obj, AnonymousType)
Return Me.Equals(other)
End Function
Public Overloads Function Equals(ByVal other As AnonymousType) As Boolean _
Implements System.IEquatable(Of AnonymousType).Equals
If other Is Nothing Then
Return False
End If
If Not Object.Equals(Me._id, other._id) Then
Return False
End If
Return True
End Function
Public Overrides Function GetHashCode() As Integer
Dim hash As Integer = 0
hash = hash Xor Me.ID.GetHashCode()
Return hash
End Function
Public Overrides Function ToString() As String
Return "{ Key .ID = " & Me.ID & ", .Name = " & Me.Name & " }"
End Function
End Class
ううむ・・・クラスのスコープは 'Friend' になるみたいですね。Equals のオーバーライドと、GetHashCodeのオーバーライドではキープロパティ が関係していますし、ToStringは宣言から文字列作ってますね。
あれ?そういえば、MSDN:匿名型の定義には以下のようなことが書かれていましたけど・・・
匿名型の定義には、既定のコンストラクタが含まれます。パラメータを必要とするコンストラクタは使用できません。
既定のコンストラクタってないよね・・・?
いったいどうなっているのでしょ?おしえてエラい人!!
あ、そうそう
明示的に名前を付けられた匿名型のプロパティは、これらの生成されるメソッドと競合することはできません。つまり、.Equals、.GetHashCode、または .ToString を使用してプロパティに名前を付けることはできません。
ですよ。