将表单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异常
答案 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