ByRef没有携带通过IN vb.net

时间:2011-10-20 13:43:22

标签: vb.net object

将表单2作为对话框调用,并通过ref传递给基类(抽象)的“指针”。 //表单1调用表单2。并传递ref对象

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 个答案:

答案 0 :(得分:2)

不,“ByRef”-ness仅 与声明参数的方法相关。 thisRobot变量的值仍然只是参考。稍后更改该变量的值不会更改调用者的变量。

答案 1 :(得分:2)

让我们来看看你的构造函数:

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

以正常(ByVal)方式将RobotContainer实例传递给构造函数,并在类中保留对整个对象的引用。现在,你的frmCreate类型和调用代码都引用了同一个对象。更新该对象上的Robot属性时,将更新这两个位置。

但实际上,这整个设计闻起来并不合适。通常我会建议一个返回创建的机器人的方法,而不是试图直接将它分配到外部位置,但我知道使用Windows窗体控件这可能不是选项。为了建议更好的解决方案,我们需要看到更多的代码。


嗯......回头看看我想做一些让RobotContainer更有用的东西:

Public Class ReferenceContainer(Of T)
    Public Property Item As T
End Class