返回值被分配但始终返回为 0

Dav*_*vid 1 vb.net

我正在尝试使用下面的代码计算客户的订单总数和价值。

    Dim iOrderCount As Integer
    Dim iLineCount As Integer
    Dim cTotalGoods As Decimal
    Dim cTotalVat As Decimal
    Dim cTotalDelivery As Decimal

    Using manOrders As New CManOrders(m_dbSql)
manOrders.GetOrdersInProgress(sAccountCode, iOrderCount, iLineCount, cTotalGoods, cTotalVat, cTotalDelivery)
Run Code Online (Sandbox Code Playgroud)

当我在子例程中为这些变量赋值时GetOrdersInProgress,这些值被正确赋值,当我单步执行代码时我可以看到这一点。

Public Sub GetOrdersInProgress(sAccountCode As String, ByRef RET_orderCount As Integer, ByRef RET_lineCount As Integer,
                               ByRef RET_totalGoods As Decimal, ByRef RET_totalVat As Decimal, RET_totalDelivery As Decimal)

    ...

    For Each dr As DataRow In m_dbSql.getDataTable(sql).Rows
        RET_orderCount = dbToInt(dr(ORDER_COUNT))
        RET_lineCount = dbToInt(dr(LINE_COUNT))
        RET_totalGoods = dbToDecimal(dr(TOTAL_GOODS))
        RET_totalVat = dbToDecimal(dr(TOTAL_VAT))
        RET_totalDelivery = dbToDecimal(dr(2))

        Return
    Next
Run Code Online (Sandbox Code Playgroud)

但是,一旦我单步执行并移回GetOrdersInProgress调用子例程的位置,变量中的所有值都会正确返回,除了RET_totalDelivery我添加到另一开发人员项目中的新值。RET_totalDelivery该行中变量的值Public Sub GetOrdersInProgress...是正确的,并且在赋值后也是正确的,但是当它到达Return并且变量随后在父子例程中使用时,出于某种原因,除了我添加的新变量之外,它们都是正确的,RET_totalDelivery。如果该值没有被正确分配,我会理解,但事实确实如此。

为什么它总是返回0?

Spe*_*cus 5

默认情况下,传递给vb.net方法的参数按值传递,或ByVal. 您没有ByRef在您的RET_totalDelivery论点中指定GetOrdersInProgress.

当方法结束时,不会保留对按值传递的参数所做的更改。

你的子系统现在应该是...

Public Sub GetOrdersInProgress(sAccountCode As String, ByRef RET_orderCount As Integer, ByRef RET_lineCount As Integer, ByRef RET_totalGoods As Decimal, ByRef RET_totalVat As Decimal, ByRef RET_totalDelivery As Decimal)
Run Code Online (Sandbox Code Playgroud)

  • @AConfusedSimpleton 这不是真的。引用类型也默认传递“ByVal”。只是“ByRef”和“ByVal”对于引用类型有不同的含义(如果您愿意的话)。当引用类型传递“ByVal”时,您可以更改它的属性,但无法更改它引用的对象。有关详细信息和示例,请参阅此[答案](/sf/answers/1379548761/)。 (7认同)