これはスレッドセーフではありませんが、私の目的には非常にうまく機能します。
使用中のソリューション:
Private _formattedFormulaText As New Lazy(Of IEnumerable(Of Label))(Function() New List(Of Label) From { _
FormulaLabels0, FormulaLabels1, lblBrownFormula, FormulaLabels3, lblGreenFormula, _
lblOrangeFormula, lblSRedFormula, FormulaLabels7, lblFormulaTotal})
欠点-変数に触れるすべてのコードは、アクセサーを追加する必要があります.value
。私のコードには、これらの怠惰なコレクションが5つあり、コレクションごとに1〜2のタッチポイントが通常同じ関数に含まれています。
欠点の図:
Dim clearText = Sub(c As Control) c.Text = String.Empty
_formattedFormulaText.ToList.ForEach(clearText)
になります
Dim clearText = Sub(c As Control) c.Text = String.Empty
_formattedFormulaText.Value.ToList.ForEach(clearText)
.net 4で使用されるデバッガー表示のグッドプラクティスに準拠していませんが、リフレクターを使用して簡単に追加できます
タッチポイントで.valueを実行する必要をなくすために、プロパティが使用された可能性があることに注意してください。
Private ReadOnly Property FormattedText As IEnumerable(Of Label)
Get
Return _formattedFormulaText.Value
End Get
End Property
サポートクラス:
''' <summary>
''' translated from http://msdn.microsoft.com/en-us/vcsharp/bb870976.aspx
''' </summary>
Public Class Lazy(Of T)
Private _func As Func(Of T)
Private _result As T
Private _hasValue As Boolean
Public Sub New(ByVal func As Func(Of T))
_func = func
_hasValue = False
End Sub
Public ReadOnly Property Value As T
Get
If Me._hasValue = False Then
_result = _func()
_hasValue = True
End If
Return _result
End Get
End Property
End Class
MSDNの記事C#でのレイジー計算に基づく設計
また、Reflectorの支援を受けて
assembly\NativeImages_v4.0.30319_32\mscorlib\246f1a5abb686b9dcdf22d3505b08cea\mscorlib.ni.dll