Установка общих значений в цикле for/next

У меня есть общий массив, который требует расчета для каждого индекса. Прямо сейчас массив инициализируется в New() и выполняется каждый раз, когда создается объект, что является избыточным. Как я могу настроить его так, чтобы массив инициализировался только один раз, когда он создается? Что-то вроде статического блока в Java?

Я изначально не включал код, потому что думал, что это простой вопрос. Конструктор вызывается 64 раза (работает со значениями битов), и соответствующий код:

' Decimal value of each bit
Public Shared bitValue(63) As Long

Public Sub New()
    ' Other non-relevant code here.

    For index = 0 To 63
        bitValue(index) = 1L << index
    Next
End Sub

На всякий случай, если вам интересно, что, черт возьми, я делаю, я переписываю написанную мной программу Java, которая работает с приведением и побитовыми операторами. Как часть изучения VB, я работаю над переводом. Вы можете получить представление о том, куда он движется, перейдя по http://sourceforge.net/projects/javabitwise/.

2 ответа

Вы можете инициализировать его сразу

Class Test1

    Private Shared _list As New List(Of String) From {"1", "2"}

End Class

Или сделать это в общем конструкторе

Class Test2

    Private Shared _list As List(Of String)

    Shared Sub New()
        _list = New List(Of String)
        _list.Add("1")
        _list.Add("2")
    End Sub

End Class

Или проверьте, инициализировано ли значение или нет в новом

Class Test3

    Private Shared _list As List(Of String)

    Public Sub New()

        ' Use synclock
        If _list Is Nothing Then
            _list = New List(Of String)
            _list.Add("1")
            _list.Add("2")
        End If

    End Sub

End Class

Или поместите свой список в одиночку

Вот быстрый пример подхода Singleton. Мы получаем доступ к классу через его Instance() функция:

Public Class Form1

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Debug.Print(KibblesAndBits.Instance.bitValue(10))
    End Sub

End Class

Public Class KibblesAndBits

    Private Shared _Kibbles As KibblesAndBits = Nothing

    Public Shared Function Instance() As KibblesAndBits
        If IsNothing(_Kibbles) Then
            _Kibbles = New KibblesAndBits ' the private constructor will now fire and initialize
        End If
        Return _Kibbles
    End Function

    Public bitValue(63) As Long

    Private Sub New() ' Private Constructor means you can't instantiate it directly
        For index = 0 To bitValue.Length - 1
            bitValue(index) = index
        Next
    End Sub

    ' ... other standard Class code ...    

End Class
Другие вопросы по тегам