我在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}
答案 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