VB调用结构体内部函数时出现对象引用未设置实例错误求助
解决VB结构体中调用方法时的“对象引用未设置”错误
首先,咱们先定位问题根源——虽然错误提示出现在Call rPatient.ChangeStatus这一行,但实际的触发点是前面的未初始化的数组操作。让我一步步拆解:
问题分析
你的patient结构体里的assignedDoctors是一个动态字符串数组,当你创建rPatient实例时,这个数组默认是Nothing(未初始化状态)。而你在btnNew_Click里直接执行了:
rPatient.assignedDoctors(1) = cbDoctor.Text
这时候数组还没有被分配内存,相当于你在操作一个不存在的对象,这就会抛出“Object reference not set to an instance of an object”错误。只是因为代码执行顺序的原因,错误提示可能被定位到了下一行的Call语句上。
另外还有两个小细节需要注意:
- VB里的结构体是值类型,
Dim rPatient As patient已经完成了实例初始化,不需要额外执行rPatient = New patient(这行代码不会报错,但属于冗余操作)。 - VB数组默认是0基索引,你的
doctorCount初始值设为1,后续操作容易造成索引混淆,建议从0开始计数。
解决方案
方案1:使用结构体自带的AddDoctor方法添加医生
既然你已经在结构体里定义了AddDoctor方法,直接调用它来添加医生就可以自动处理数组的初始化和扩容,避免手动操作数组的风险:
Private Sub btnNew_Click(sender As Object, e As EventArgs) Handles btnNew.Click Dim rPatient As patient rPatient.givenName = txtPatientName.Text ' 直接调用AddDoctor,不需要手动初始化数组和设置doctorCount rPatient.AddDoctor(cbDoctor.Text) Call rPatient.ChangeStatus(status:=cbStatus.Text) ArrayFix(rPatient.assignedDoctors, rPatient.givenName, rPatient.infected) End Sub
这样AddDoctor方法会自动帮你完成doctorCount的递增和数组的扩容,完全规避了数组未初始化的问题。
方案2:手动初始化数组(不推荐,不如用自带方法)
如果你一定要手动操作数组,那需要先初始化数组再赋值:
Private Sub btnNew_Click(sender As Object, e As EventArgs) Handles btnNew.Click Dim rPatient As patient rPatient.givenName = txtPatientName.Text ' 先初始化数组,长度为1(对应索引0) ReDim rPatient.assignedDoctors(0) rPatient.assignedDoctors(0) = cbDoctor.Text rPatient.doctorCount = 1 ' 这里的计数要和数组长度对应 Call rPatient.ChangeStatus(status:=cbStatus.Text) ArrayFix(rPatient.assignedDoctors, rPatient.givenName, rPatient.infected) End Sub
但这种方式需要你自己维护数组长度和doctorCount的一致性,容易出错,所以更推荐使用方案1。
额外优化:调整数组索引逻辑(可选)
为了符合VB的0基索引习惯,你可以修改AddDoctor方法的逻辑,让计数从0开始:
Public Sub AddDoctor(ByRef doctor As String) ReDim Preserve assignedDoctors(doctorCount) assignedDoctors(doctorCount) = doctor doctorCount += 1 End Sub
这样第一次调用时,数组会被扩容到索引0,赋值后doctorCount变成1,后续添加时依次往后,逻辑更清晰。
内容的提问来源于stack exchange,提问作者Marc Levin
相关产品推荐
相关产品推荐

