Это не потокобезопасно, но очень хорошо подходит для моих целей:
Используемое решение:
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