在Initialize Component之前清理优雅的表单级组件集合初始化解决方案?

时间:2011-02-03 19:59:07

标签: vb.net winforms initializecomponent

我在vs2010中将旧的Vb6解决方案转换为.net 2.0。我已经在C#工作了大约3年,而.net用于5.我不记得在C#中有这个问题,但如果我想初始化readonly DerivedControlFoo集合除了创建一个sub以便在其他地方完成所有操作之外,还有一种干净的方法吗?我希望能够在宣言中在课堂上做到这一点,以便于阅读和简化。

示例:

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

以简单明了的方式做到这一点,会导致集合被{nothing,..,nothing}

填充

1 个答案:

答案 0 :(得分:0)

这不是线程安全的,但对我的目的非常有效:

使用中的解决方案:

 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文章Lazy Computation in C#的设计 还有Reflector对

的帮助
assembly\NativeImages_v4.0.30319_32\mscorlib\246f1a5abb686b9dcdf22d3505b08cea\mscorlib.ni.dll