vb.net - 我的函数和过程中的什么导致堆栈溢出?
问题描述
我正在尝试将我的三个函数添加到一个过程中。函数是CalcOilLubeCharges
、CalcMiscCharges
和CalcFlushCharges
。在尝试调用将它们加在一起并将它们设置为变量的函数后,我收到了堆栈溢出警告。
public Class frmTGAutomotie
' Function ValidateInputs() As Boolean
' Return
'End Function
' Calculate all oil and lubrication charges
Function CalcOilLubeCharges() As Decimal
Const Oil = 36.0
Const Lube = 28.0
If chkOil.Checked Then
CalcOilLubeCharges = CInt(CalcOilLubeCharges() + Oil)
End If
If chkLube.Checked Then
CalcOilLubeCharges = CInt(CalcOilLubeCharges() + Lube)
End If
Return CalcOilLubeCharges
End Function
' Calculate radiator and transmission flush charges
Function CalcFlushCharges() As Decimal
Const Radiator = 50.0
Const Transmission = 120.0
If chkRadiator.Checked Then
CalcFlushCharges = CInt(CalcFlushCharges() + Radiator)
End If
If chkTransmission.Checked Then
CalcFlushCharges = CInt(CalcFlushCharges() + Transmission)
End If
Return CalcFlushCharges
End Function
' Calc Misc charges
Function CalcMiscCharges() As Decimal
Const Inspection = 36.0
Const Muffler = 200.0
Const Rotation = 20.0
If chkInspection.Checked Then
CalcMiscCharges = CInt(CalcMiscCharges + Inspection)
End If
If chkMuffler.Checked Then
CalcMiscCharges = CInt(CalcMiscCharges + Muffler)
End If
If chkTireRotation.Checked Then
CalcMiscCharges = CInt(CalcMiscCharges + Rotation)
End If
Return CalcMiscCharges
End Function
'Calculate and display the total of all charges,
' including labor, parts, and services.
Sub CalculateTotalCharges()
Dim TotalCharges As Decimal
TotalCharges = CalcMiscCharges() + CalcOilLubeCharges() + CalcFlushCharges()
lbTotalFeesOutput.Text = TotalCharges.ToString
End Sub
'Clear
Sub ClearOilLube()
chkOil.Checked = False
chkLube.Checked = False
End Sub
'Clear
Sub ClearFlushes()
chkTransmission.Checked = False
chkRadiator.Checked = False
End Sub
'Clear
Sub ClearMisc()
chkInspection.Checked = False
chkMuffler.Checked = False
chkTireRotation.Checked = False
End Sub
'Clear
Sub ClearOthers()
txtPartsDollars.Clear()
txtLaborMinutes.Clear()
End Sub
Private Sub GroupBox2_Enter(sender As Object, e As EventArgs) Handles grpMisc.Enter
End Sub
Private Sub Label1_Click(sender As Object, e As EventArgs) Handles lbOilPrice.Click
End Sub
Private Sub Label12_Click(sender As Object, e As EventArgs) Handles lbDollarSign4.Click
End Sub
Private Sub Label15_Click(sender As Object, e As EventArgs) Handles lbDollarSign7.Click
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
End Sub
Private Sub btnExit_Click(sender As Object, e As EventArgs) Handles btnExit.Click
Me.Close()
End Sub
Private Sub btnClear_Click(sender As Object, e As EventArgs) Handles btnClear.Click
ClearOilLube()
ClearFlushes()
ClearMisc()
ClearOthers()
End Sub
Private Sub lbTotalFeesOutput_Click(sender As Object, e As EventArgs) Handles lbTotalFeesOutput.Click
End Sub
Private Sub btnCalculate_Click(sender As Object, e As EventArgs) Handles btnCalculate.Click
CalculateTotalCharges()
End Sub
Private Sub txtPartsDollars_TextChanged(sender As Object, e As EventArgs) Handles txtPartsDollars.TextChanged
End Sub
End Class
解决方案
让我们看看第一个函数,看看它哪里出错了。
Function CalcOilLubeCharges() As Decimal
Const Oil = 36.0
Const Lube = 28.0
If chkOil.Checked Then
CalcOilLubeCharges = CInt(CalcOilLubeCharges() + Oil)
End If
第一行声明了一个函数,名称为 CalcOilLubeCharges,返回类型为 Decimal
接下来的 2 行声明常量。编译器不知道您希望处理 Decimal(在处理金钱时首选),因此它假定 Double。您可以通过将光标悬停在Oil
和上来判断这一点Lube
。更正这个D
数字后的地方。
让我们假设chkOil
已检查。现在麻烦来了。
CalcOilLubeCharges = CInt(CalcOilLubeCharges() + Lube)
赋值的右侧调用CalcOilLubeCharges
我们所在的方法。您可能错误地认为这是一个变量,但它是 a 的名称Function
。这种情况一遍又一遍地发生,直到我们得到堆栈溢出。
要更正此问题,请使用本地声明的变量来保存值。
我还向您展示了一种使用+=
.
Function CalcOilLubeCharges() As Decimal
Const Oil = 36D
Const Lube = 28D
Dim LubeOilCharge As Decimal
If chkOil.Checked Then
LubeOilCharge += Oil
End If
If chkLube.Checked Then
LubeOilCharge += Lube
End If
Return LubeOilCharge
End Function
Function CalcFlushCharges() As Decimal
Const Radiator = 50D
Const Transmission = 120D
Dim Flush As Decimal
If chkRadiator.Checked Then
Flush += Radiator
End If
If chkTransmission.Checked Then
Flush += Transmission
End If
Return Flush
End Function
Function CalcMiscCharges() As Decimal
Const Inspection = 36D
Const Muffler = 200D
Const Rotation = 20D
Dim Misc As Decimal
If chkInspection.Checked Then
Misc += Inspection
End If
If chkMuffler.Checked Then
Misc += Muffler
End If
If chkTireRotation.Checked Then
Misc += Rotation
End If
Return Misc
End Function
Sub CalculateTotalCharges()
Dim TotalCharges As Decimal
TotalCharges = CalcMiscCharges() + CalcOilLubeCharges() + CalcFlushCharges()
lbTotalFeesOutput.Text = TotalCharges.ToString("N2")
End Sub
推荐阅读
- python - 如何获取文件路径目录并使用它来读取我的 excel 文件?(苹果电脑)
- php - 1142 尽管使用了 mysql_native_password,但使用 PDO 时出错
- redis - 将任何消息代理用于 spark 数据帧的更好解决方案
- python - 将模块添加到谷歌云功能
- entity-framework - 使用 efcore 选择整个元素时生成多个查询
- python - Python中的正则表达式返回文本文件中的完整字符
- javascript - 如何根据鼠标位置做图像幻灯片过渡效果?
- three.js - 如何在三个js中切换渲染目标的纹理?
- python - 找到一组过滤的组合的算法
- android - 在 Kotlin 中刷新片段