2

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

例子:

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

以直接简单的方式执行此操作,导致集合中充满{nothing,..,nothing}

4

1 回答 1

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
于 2011-02-07T16:37:17.870 回答