Чистое элегантное решение для инициализации коллекции компонентов уровня класса до инициализации компонента? - PullRequest
2 голосов
/ 03 февраля 2011

Я конвертирую старое решение Vb6 в .net 2.0 в версии 2010 года. Я работаю в 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}

1 Ответ

0 голосов
/ 07 февраля 2011

Это не потокобезопасно, но очень хорошо подходит для моих целей:

Используемое решение:

 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 Ленивые вычисления в C # Также с помощью Reflector против

assembly\NativeImages_v4.0.30319_32\mscorlib\246f1a5abb686b9dcdf22d3505b08cea\mscorlib.ni.dll
...