我有一段代码,当某些按钮被按下时,将在整个表单中重复几次。在单击按钮时,应该将文本框内的小数点后的值添加到每个按钮之间的不同值。到目前为止,我的代码如下:
Function EditPrice(ByVal a As Decimal, ByVal b As Decimal)
Dim num1 As Decimal
num1 = a + b
Return num1
End Function
Private Sub btnMinusMushroom_Click(sender As Object, e As EventArgs) Handles btnMinusMushroom.Click
EditPrice(CDec(txtEditCost.Text) + "0.5")
End Sub
如果尚不清楚代码应执行的操作,则函数“ EditPrice”中的“ a”变量是文本框“ txtEditCost”内的十进制值,而.5的十进制值应为添加到文本框值。
函数名称带红色下划线,表示“未为'公共函数EditPrice(ByVal a As Decimal,ByVal b As Decimal)作为对象的参数'b'指定参数”。 我不知道这意味着什么或如何解决问题,有什么想法吗?,谢谢
答案 0 :(得分:5)
您的代码存在许多问题。为了帮助您将来避免此类问题,我强烈建议您设置Option Strict On
。这将不允许缩小隐式转换和后期绑定的范围,这将迫使您更多地考虑使用的数据类型。您可以在项目属性中为当前项目设置On
。您还可以在IDE选项中将其设置为On
,以便在以后的所有项目中默认为On
。
第一个问题是Option Strict On
会标记的问题,即您已声明一个没有返回类型的函数。这个:
Function EditPrice(ByVal a As Decimal, ByVal b As Decimal)
应该是这样:
Function EditPrice(ByVal a As Decimal, ByVal b As Decimal) As Decimal
第二个问题与该功能的命名有关。您已将其命名为EditPrice
,但是,如果查看该方法的实际代码,则该名称与它完全无关。那里没有价格,也没有编辑。它所做的就是将两个Decimal
类型的数字相加并返回结果。没什么要求数字代表价格,也没有编辑,因为方法没有改变。
第三个问题是如何调用方法。该方法声明为带有两个Decimal
自变量,但是您在做什么?
EditPrice(CDec(txtEditCost.Text) + "0.5")
这有什么意义?您从String
获得了一个TextBox
,并将其转换为Decimal
,然后向其中添加了另一个String
,然后将单个结果传递给该方法。那是各种各样的错。首先,为什么要在String
上添加Decimal
?如果要将数字0.5加到某物上,请使用数字,而不要使用String
。如果要添加到Deciaml
,请使用十进制数。其次,当方法的重点是将两个数字相加时,为什么要在其中添加两个数字并将结果传递给方法?该代码应该更像这样:
EditPrice(CDec(txtEditCost.Text), 0.5D)
但这仍然是一个问题,因为正如我所说,EditPrice
方法实际上并没有编辑任何内容。它仅添加两个输入并返回结果,但实际上并没有使用该结果。您大概想在某个地方显示该结果。如果再次位于同一TextBox
中,则需要这样做:
txtEditCost.Text = EditPrice(CDec(txtEditCost.Text), 0.5D).ToString()
也请注意ToString
那里的电话。 Option Strict On
将需要这样做,因为该Text
属性的类型为String
,并且该方法返回一个Decimal
。
即使进行了这些更改,代码仍然有些不可靠。当您可以用一个简单的加法运算符进行内联运算时,将两个数字相加并返回结果的方法有什么意义?如果将一个方法命名为EditPrice
,那么它实际上应该编辑一个价格。在这种情况下,将一个数字加到当前价格上,然后让该方法进行更改,例如
Private Sub EditPrice(valueToAdd As Decimal)
Dim currentValue As Decimal
'This will get the current value or zero if there is no valid value.
Decimal.TryParse(txtEditCost.Text, currentValue)
Dim newValue As Decimal = currentValue + valueToAdd
txtEditCost.Text = newValue.ToString()
End Sub
请注意,这是Sub
而不是Function
,因为它实际上是在进行更改,而不是返回其他代码用来进行更改的值。在这种情况下,名称实际上描述了该方法的作用。方法名称应始终描述方法的实际作用。