Vb.net 清洁优雅的解决方案,形成类级组件集合,在初始化组件之前初始化?
我正在vs2010中将旧的Vb6解决方案转换为.net 2.0。我在C#工作了大约3年,在.net工作了5年。我不记得在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
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