Gyzmo Ответов: 1

Как настроить массив в VB.NET


Я пытался настроить массив с парой уровней в нем, чтобы я мог выбрать "дом", "комнату" и "предметы", где есть дом с 2 комнатами и 3 предметами в каждой комнате, поэтому я хочу иметь возможность использовать "дом".Комната (1).Предмет(2). Имя".
Я могу настроить массив как Дом.Комната (1).Пункт(2).Имя = " Спальня"
но потом я получаю ошибку - "ССЫЛКА на объект не установлена на экземпляр объекта".
Если я настрою каждую переменную отдельно, это нормально, но когда я добавляю массив для комнат и предметов, я не могу получить к нему доступ и получаю вышеуказанную ошибку.
Я попробовал несколько вариантов и просмотрел несколько образцов, которые не работают, я надеюсь, что кто-то может предложить некоторые изменения.

Что я уже пробовал:

Structure Pieces
    Public Name1 As String
    Public Name2 As String
    Public Name3 As String
End Structure

Structure EachRoom
    Public Name As String        'holds the room name
    Public Items() As Pieces
    Private Sub Initialize()
        ReDim Items(0 To 3)
    End Sub
End Structure

Structure MyHouse
    Public Name As String
    Public Room() As EachRoom
    Private Sub Initialize()
        ReDim Room(0 To 2)
    End Sub
End Structure
Public House As MyHouse

[no name]

Узнайте, как использовать отладчик.

Richard Deeming

Никто из кода, который вы выложили не вызывает частная Initialize методы, поэтому ваши массивы никогда не инициализируются и всегда будут инициализироваться Nothing.

1 Ответов

Рейтинг:
8

Ralf Meier

используйте классы вместо структур ... но заметьте : классы хотите быть инстанцирован ...

Class Pieces
      Public Name1 As String
      Public Name2 As String
      Public Name3 As String

      Public Sub New()
      End Sub
  End Class

  Class EachRoom
      Public Name As String        'holds the room name
      Public Items As New List(Of Pieces)

      Public Sub New()
          For i As Integer = 0 To 3
              Items.Add(New Pieces)
          Next
      End Sub
  End Class

  Class MyHouse
      Public Name As String
      Public Room As New List(Of EachRoom)

      Public Sub New()
          For i As Integer = 0 To 2
              Room.Add(New EachRoom)
          Next
      End Sub
  End Class

  Public House As New MyHouse


Дополнительно как написано в ответе :

Class MyHouse
    Public Name As String
    Public Room As New List(Of EachRoom)

    Public Sub New()
        For i As Integer = 0 To 2
            Room.Add(New EachRoom)
        Next
    End Sub

    Public Sub New(RoomCount as integer) ' with this constructor you can tell the class how much EachRoom you want to have inside it. You are now flexible and not more fixed to 3 EachRoom ...
        For i As Integer = 1 To RoomCount
            Room.Add(New EachRoom)
        Next
    End Sub
End Class


Gyzmo

Да, после выключения компьютера я понял, что забыл добавить команды инициализации, спасибо за это, и на самом деле пошел добавить их, когда увидел ваш ответ.
Я искал и работал над вашим кодом, но не понимал ,что "классы хотят быть инстанцированными", так как мне не приходилось делать этого раньше(это швы).
Надеюсь, вы можете предложить предложение спасибо.

Ralf Meier

ОК... вы проверили мои изменения в вашем коде ?
Если да, то вы видели, что этот код автоматически делает (с помощью конструктора : New) то, что вы хотите.
В отличие от структуры это :
- если вы пишете: "публичный дом как мой дом", вы не создали сам объект - вы только определили его тип
- если вы пишете : "Public House as NEW MyHouse", вы создаете новый экземпляр объекта со всеми его функциональными возможностями. Также вызывается конструктор-метод " New " внутри класса. Если вы последуете этому пути, то увидите, что вы также можете создавать различные конструкторы для класса. Чтобы понять, что я имею в виду, вы должны немного проверить сам код и то, что он делает (отладчик !!! и точки останова внутри кода !!!)
Чтобы дать вам представление, я улучшаю свой ответ с помощью второго конструктора ...

(Если вы находите мой ответ полезным, было бы неплохо, если бы вы его приняли)