Установка общих значений в цикле 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