とりこらぼ。:というわけで、My を拡張するならここを読むべし♪
の元ネタ↓
MSDN : Visual Basic における My 名前空間の拡張
夏休みの読書感想文のネタに読書していましたが、1点忘れないようにメモしときます。
何はともあれ、Myを拡張してみます。拡張はMy.Algorithmとかで、こないだのへっぼこソートをMy名前空間で使えるようにしましょう♪
まずは拡張内容を含むクラスをご用意。MyAlgorithm クラスとしましょう。
Public Class MyAlgorithm
Public Sub MogoMogoSort(ByVal list As IList(Of IComparable))
While Not IsSorted(list)
Shuffle(list)
End While
End Sub
Private Sub Shuffle(ByVal list As IList(Of IComparable))
Dim r = New Random()
For i = 0 To list.Count - 1
Dim value = r.Next(list.Count)
Dim temp = list.Item(i)
list.Item(i) = list.Item(value)
list.Item(value) = temp
Next i
End Sub
Private Function IsSorted(ByVal list As IList(Of IComparable)) As Boolean
If list.Count < 2 Then
Return True
End If
For i = 0 To list.Count - 2
If list.Item(i).CompareTo(list.Item(i + 1)) > 0 Then
Return False
End If
Next i
Return True
End Function
End Class
ま、これの中身はそれほど大切じゃなくってぇ、問題は次のMy名前空間への追加ですね。
この部分↓
メンバを My 名前空間に追加するには、必要に応じてモジュールにプロパティを追加します。My 名前空間に追加されるプロパティごとに、ThreadSafeObjectProvider(Of T) 型のプライベート フィールドを追加します。この型は、カスタム プロパティによって返される型です。このフィールドは、GetInstance メソッドの呼び出しによってプロパティから返されるスレッド セーフなオブジェクト インスタンスの作成に使用されます。その結果、拡張プロパティにアクセスする各スレッドは、返された型の独自のインスタンスを受け取ります。次の例では、SampleExtension 型の SampleExtension というプロパティを My 名前空間に追加します。
My 名前空間へのカスタム オブジェクトの追加
ふむふむ…こういうことかな?
Namespace My
<Global.Microsoft.VisualBasic.HideModuleName()> _
Module MyExtention
Private _myAlgorithmProvider As New ThreadSafeObjectProvider(Of MyAlgorithm)
Friend ReadOnly Property Algorithm() As MyAlgorithm
Get
Return _myAlgorithmProvider.GetInstance()
End Get
End Property
End Module
End Namespace
で、ThreadSafeObjectProvider(Of T) ってなんぞ?
オブジェクトブラウザでも見つからない…。というわけでつづく。