Сначала необходимо создать массив, затем выполнить цикл по массиву и назначить каждый элемент. Кроме того, если у вас нет веских причин, делайте это в конструкторе, а не в отдельном методе init.
Public Class Form
Public Sub New()
'In VB, you give the max index, not the length.
'I prefer listing this as (whatever I want for length) - 1
Me.Info = New Info(size - 1) {}
For i = 0 to size - 1
Me.Info(i) = New Info()
Next
'similarly for other fields
End Sub
End Class
В качестве альтернативы, если вы обнаружите, что у вас много полей массива, и все они имеют конструкторы по умолчанию, вы можете создать класс FixedCollection
, который будет инкапсулировать повторяющийся код инициализации.
Public Class FixedCollection(Of T As New)
Inherits Collection(Of T)
Public Sub New(ByVal size As Integer)
MyBase.New(New T(size - 1) {})
For i = 0 to size - 1
Me.Items(i) = New T()
Next
End Sub
'alternate constructors if you need additional initialization
'beyond construction of each element
Public Sub New(ByVal size As Integer, ByVal creator As Func(Of T))
MyBase.New(New T(size - 1) {})
If creator Is Nothing Then Throw New ArgumentNullException("creator")
For i = 0 to size - 1
Me.Items(i) = creator()
Next
End Sub
'this overload allows you to include the index in the collection
'if it would matter to creation
Public Sub New(ByVal size As Integer, ByVal creator As Func(Of Integer, T))
MyBase.New(New T(size - 1) {})
If creator Is Nothing Then Throw New ArgumentNullException("creator")
For i = 0 to size - 1
Me.Items(i) = creator(i)
Next
End Sub
'other collection overrides as needed here
End Class
EDIT: Добавлены перегрузки конструктора для случаев, когда конструктора элемента недостаточно.
Если вы используете конструкторы только с параметром создателя, вы можете удалить ограничение New
для T
.
Используйте следующие перегрузки:
Public Class Form
Private InfoField As New FixedCollection(Of Info)(10,
Function()
Dim ret As New Info()
ret.Init()
End Function)
End Class
Судя по вашим комментариям, методы Init
крайне нежелательны. Если возможно, я бы порекомендовал вам найти способ изменить сгенерированный конструктор так, чтобы он вызывал этот метод (определенный в сгенерированном коде с использованием частичных методов) вместо того, чтобы заставлять его вызывать его самостоятельно.