VB.NET中变量'stocks'未赋值即使用报错,求代码修正指导
VB.NET报错:"variable 'stocks' is used before it has been assigned a value" 问题分析与修复
问题场景
编写VB.NET代码时遇到上述报错,相关代码如下:
For i = 0 To _myTable.Rows.Count - 1 Dim detail = New ItemTransfersDetail With { .No = Convert.ToInt32(_myTable.Rows(i)(0)), .Invno = BtxtInvoNo.Text, .CodeProduct = _myTable.Rows(i)(1).ToString(), .Barcode = _myTable.Rows(i)(2).ToString(), .Colorcode = _myTable.Rows(i)(3).ToString(), .Size = _myTable.Rows(i)(4).ToString(), .Qty = Convert.ToInt32(_myTable.Rows(i)(5).ToString()) } Dim stocks = New Stocks With { ' 报错行 .QTY_STOCK = (stocks.QTY_STOCK - detail.Qty), .CodeProduct = _myTable.Rows(i)(1).ToString(), .Barcode = _myTable.Rows(i)(2).ToString(), .Colorcode = _myTable.Rows(i)(3).ToString(), .Size = _myTable.Rows(i)(4).ToString() } itrservicedetail.InsertItemTransfersdetail(detail) sservice.Updatestockminus(stocks) Next Public Class Stocks Public Property CodeProduct() As String Public Property Barcode() As String Public Property Colorcode() As String Public Property Size() As String Public Property QTY_STOCK() As Integer End Class
错误原因
报错的核心问题是:在使用对象初始化器创建stocks对象时,你试图引用还未完成初始化的stocks变量的QTY_STOCK属性来计算新值。此时stocks还没有被赋值(对象还没创建完成),它的属性自然没有有效值,VB.NET编译器会直接检测到这个未定义的引用并报错。
简单说,你不能用一个正在创建的对象的属性,来给它自己的属性赋值。
修复方案
要实现“库存减去出库数量”的逻辑,你需要先从数据源(比如数据库)获取该商品当前的库存数量,再用这个值减去detail.Qty,最后赋值给Stocks对象的QTY_STOCK属性。
修改后的代码示例:
For i = 0 To _myTable.Rows.Count - 1 Dim detail = New ItemTransfersDetail With { .No = Convert.ToInt32(_myTable.Rows(i)(0)), .Invno = BtxtInvoNo.Text, .CodeProduct = _myTable.Rows(i)(1).ToString(), .Barcode = _myTable.Rows(i)(2).ToString(), .Colorcode = _myTable.Rows(i)(3).ToString(), .Size = _myTable.Rows(i)(4).ToString(), .Qty = Convert.ToInt32(_myTable.Rows(i)(5).ToString()) } ' 1. 先根据商品标识查询当前库存数量 Dim currentStockQty = sservice.GetCurrentStockQty( detail.CodeProduct, detail.Barcode, detail.Colorcode, detail.Size ) ' 2. 计算更新后的库存数量 Dim updatedStockQty = currentStockQty - detail.Qty ' 3. 初始化Stocks对象 Dim stocks = New Stocks With { .QTY_STOCK = updatedStockQty, .CodeProduct = detail.CodeProduct, .Barcode = detail.Barcode, .Colorcode = detail.Colorcode, .Size = detail.Size } itrservicedetail.InsertItemTransfersdetail(detail) sservice.Updatestockminus(stocks) Next
说明:
GetCurrentStockQty是需要你自己实现的方法,功能是根据商品的CodeProduct、Barcode等唯一标识,从数据库中查询当前的库存数量。- 这样既避免了引用未初始化的
stocks变量,逻辑上也符合“先获取当前库存,再计算更新后的值”的业务流程。
内容的提问来源于stack exchange,提问作者roy
相关产品推荐
相关产品推荐

