ByRef не переносит через В vb.net - PullRequest
1 голос
/ 20 октября 2011

Один вызывает форму 2 как диалог и передает ref "указатель" на базовый класс (аннотация). // Форма 1, вызывающая форму два. И Передача реф объекта

Dim CreateForm As New frmCreate(Robot)

// Вторые формы перегружены, новые

Public Sub New(ByRef Robot As cRobot)
    InitializeComponent()
    thisRobot = Robot
End Sub

Select Case (cbType.SelectedIndex)
        Case 0
            lblOther.Text = "Bullet Proof Value"
            Dim SecRobot = New cSecurityRobot
            SecRobot.Name = txtName.Text
            SecRobot.Temperature = nudTemp.Value
            SecRobot.Threshold = nudThreshold.Value
            SecRobot.BulletproofValue = nudOther.Value
            thisRobot = SecRobot
        Case 1
            lblOther.Text = "Special Moves"
            Dim SpRobot = New cSportsRobot
            SpRobot.Name = txtName.Text
            SpRobot.Temperature = nudTemp.Value
            SpRobot.Threshold = nudThreshold.Value
            SpRobot.SpecialMoves = nudOther.Value
            thisRobot = SpRobot
        Case 2
            lblOther.Text = "Domestic Skills"
            Dim SerRobot = New cServiceRobot
            lblOther.Text = "Domestic Skills"
            SerRobot.Name = txtName.Text
            SerRobot.Temperature = nudTemp.Value
            SerRobot.Threshold = nudThreshold.Value
            SerRobot.DomesticSkills = nudOther.Value
            thisRobot = SerRobot
        Case Else
            lblOther.Text = "Bullet Proof Value"
            Dim SecRobot = New cSecurityRobot
            SecRobot.Name = txtName.Text
            SecRobot.Temperature = nudTemp.Value
            SecRobot.Threshold = nudThreshold.Value
            SecRobot.BulletproofValue = nudOther.Value
            thisRobot = SecRobot
    End Select

Форма 2 присваивает некоторые значения и завершается, но всегда возникает исключение NULL

Ответы [ 2 ]

3 голосов
/ 20 октября 2011

Давайте посмотрим на ваш конструктор:

Public Sub New(ByRef Robot As cRobot)
    InitializeComponent()
    thisRobot = Robot '<-- Problem is here
End Sub

В строке, указанной выше, вы создаете копию ссылки, и поэтому ByRef вам больше не помогает.

Думая о том, как обойти эту проблему, вы можете сделать это, вложив Robot в другой класс:

Public Class RobotContainer
     Public Property Robot As Robot
End Class

Передайте экземпляр RobotContainer вашему конструктору в обычном (ByVal) и сохраните ссылку на весь этот объект в вашем классе.Теперь и ваш тип frmCreate, и вызывающий код имеют ссылку на один и тот же объект .Когда вы обновите свойство Robot для этого объекта, оно будет обновлено для обоих местоположений.

Но на самом деле весь этот дизайн не пахнет правильно.Обычно я бы предложил метод, который возвращает созданного робота, вместо того, чтобы пытаться назначить его внешнему местоположению напрямую, но я понимаю, что при работе с элементами управления Windows Forms это может быть не вариант.Чтобы предложить лучшее решение, нам нужно увидеть намного больше вашего кода.


Хм ... оглядываясь назад, я хотел сделать что-то, чтобы сделать RobotContainer более полезным:

Public Class ReferenceContainer(Of T)
    Public Property Item As T
End Class
2 голосов
/ 20 октября 2011

Нет, "ByRef" -ness равен только и относится к методу, в котором объявлен параметр. Значение переменной thisRobot все еще является справочным значением . Изменение значения этой переменной в дальнейшем не изменит переменную вызывающей стороны .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...