Vb.net 清洁优雅的解决方案,形成类级组件集合,在初始化组件之前初始化?

Vb.net 清洁优雅的解决方案,形成类级组件集合,在初始化组件之前初始化?,vb.net,winforms,initializecomponent,Vb.net,Winforms,Initializecomponent,我正在vs2010中将旧的Vb6解决方案转换为.net 2.0。我在C#工作了大约3年,在.net工作了5年。我不记得在C#中有过这个问题,但是如果我想初始化DerivedControlFoo的readonly集合,除了在其他地方创建一个子集之外,还有没有一种干净的方法来完成它?为了可读性和简单性,我希望能够在类级别的声明中这样做 例如: Private _formattedFormulaText As IEnumerable(Of Label) = New List(Of Label) Fro

我正在vs2010中将旧的Vb6解决方案转换为.net 2.0。我在C#工作了大约3年,在.net工作了5年。我不记得在
C#
中有过这个问题,但是如果我想初始化
DerivedControlFoo
readonly
集合,除了在其他地方创建一个子集之外,还有没有一种干净的方法来完成它?为了可读性和简单性,我希望能够在类级别的声明中这样做

例如:

Private _formattedFormulaText As IEnumerable(Of Label) = New List(Of Label) From { _
 FormulaLabels0, FormulaLabels1, lblBrownFormula, FormulaLabels3, lblGreenFormula, _
      lblOrangeFormula, lblRedFormula, FormulaLabels7, lblFormulaTotal}

以简单明了的方式执行此操作,会导致集合中充满
{nothing,…,nothing}

这不是线程安全的,但对于我来说效果非常好:

正在使用的解决方案:

 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)
不符合.NET4中使用的调试器显示的良好实践,但使用reflector很容易添加


请注意,可以使用属性来消除接触点中的。值的需要:

   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

这不是线程安全的,但在我看来效果很好:

正在使用的解决方案:

 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)
不符合.NET4中使用的调试器显示的良好实践,但使用reflector很容易添加


请注意,可以使用属性来消除接触点中的。值的需要:

   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