与接近If语句和调试混淆

时间:2012-02-27 03:03:22

标签: visual-studio-2010 debugging if-statement try-catch

非常 Visual Studio 2010的新功能。

对于我的课,我需要制作一个计算器。这个问题的要求是如果A或B为零,那么程序实际上不计算A或B;相反,程序将非零变量的值分配给eh结果,如果它们都为零,则只需将答案设为零。

这是我的代码:

Public Class Form1


    Private Sub AddBox_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AddButton.Click

        Dim A As Decimal
        Dim B As Decimal
        Dim Result As Decimal

        A = ABox.Text
        B = BBox.Text

        A = Decimal.Parse(ABox.Text)
        B = Decimal.Parse(BBox.Text)

        If (ABox.Text = 0) Then

            ResultLabel.Text = BBox.Text

        End If

        If (BBox.Text = 0) Then

            ResultLabel.Text = ABox.Text

        End If

        If (BBox.Text = 0 And ABox.Text = 0) Then

            ResultLabel.Text = 0

        End If

        Result = A + B

        ResultLabel.Text = Result.ToString("N2")

    End Sub

我的问题如下:

  1. if语句是否适用于此,或者Try / Catch会更好吗?
  2. 由于答案将自动正确,即使代码不正确(例如9 + 0将是9,无论If或Try / Catch是否真正有效),它们的键是正确的逐步调试。这样做的最佳方法是什么?我有一个菜单一步一步显示程序之前的程序功能,但由于某种原因,我关闭后似乎无法找到窗口。我希望逐步看到它,因为我使用断点进行调试。
  3. 关于这些类型的条件运算符的良好语法的任何其他提示?

    抱歉听起来很愚蠢;我在这里找不到涵盖此类问题的主题。

1 个答案:

答案 0 :(得分:1)

好的......首先,你根本不需要If。 (增加的身份属性:对于任何xx + 0 = x。)任何将要发生的错误都会在你到达它们之前发生,所以你唯一要做的就是说如果ABox解析为零,BBox的值类似于“5.000000”,所有这些零都将被复制到结果中。同样,如果方框相反。

此外,如果您使用Decimal.TryParse而不是Decimal.Parse,则输入框中的非数字内容不会终止您的程序。他们只会变成0。

使用某些代码(如

)可以得到类似的结果(减去额外的零)
Private Sub AddBox_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AddButton.Click
    Dim A as Decimal, B as Decimal
    Decimal.TryParse(ABox.Text, A)
    Decimal.TryParse(BBox.Text, B)
    ResultBox.Text = (A + B).ToString("N2")
End Sub

如果出于某种愚蠢的原因,你真的,真的需要所有 If 废话,你会想要使用ElseIf来确保默认情况没有跑。

Private Sub AddBox_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AddButton.Click
    Dim A as Decimal
    Dim B as Decimal
    Decimal.TryParse(ABox.Text, A)
    Decimal.TryParse(BBox.Text, B)
    If A = 0 then
        ResultBox.Text = BBox.Text
    ElseIf B = 0 then
        ResultBox.Text = ABox.Text
    Else
        Dim result as Decimal = A + B
        ResultBox.Text = result.ToString("N2")
    End If
End Sub

但这是浪费 - 而更糟糕的是,如果要添加两个数字,这是不正确的。有人可以在第一个盒子里放上“我喜欢奶酪”和“YAAAAAAAAAY !!!”在另一方面,结果将是“YAAAAAAAAAY !!!”。显然不会发生什么。

Private Sub AddBox_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles AddButton.Click
    Dim A as Decimal
    Dim B as Decimal
    Try
        A = Decimal.Parse(ABox.Text)
        B = Decimal.Parse(BBox.Text)
        ResultBox.Text = (A + B).ToString("N2")
    Catch ex as FormatException
        MessageBox.Show("Exactly two numbers (one per box), please!")
    End Try
End Sub

但我讨厌这样做是为了用户输入。您应该期望用户恶意和/或愚蠢,并指望他们尽一切可能搞乱您的应用程序。它稍后会为您节省大量的调试工作。但是,如果我们假设最坏的情况,那么输入错误真的是一种特殊情况吗?我拒绝。 (其他人可能不同意。但他们错了。:))

如果要通知用户输入错误,Decimal.TryParse也会返回一个布尔值(true / false),说明它是否成功。如果失败,您可以显示一条消息,告诉用户退出白痴。 (如果你愿意的话,稍微外交一点。)


其次......打开Option Strict。请。所有这些隐含的铸造都给了我坚强的意志。请注意,这可能会在您的列表中添加十几个错误...但这是的事情。一个人应该知道当他们试图将一个数字放在一个字符串变量等等时,会导致很多魔法发生在那里(在我看来)人们需要更多地意识到这一点。


K,现在,至于调试......如果到目前为止你已经按照我的建议,你不应该真的需要调试。异常消失了,代码在你编译之前会更加正确。但是如果你仍然需要,那么逐步完成该程序的一种方法是在Function行本身或者不是声明的第一行设置断点。 (单击该行旁边的左边距。一个红色的球应出现在你点击的边缘。这可以让你知道那里有一个断点。)你可以尝试在声明上设置一个断点,但我似乎记住导致断点要么在实际做某事的下一行,要么在函数的开头。我忘记了,并且没有VS在这台机器上检查。)

当你从VS运行程序时,程序将启动,当它到达断点时,VS将以红色箭头所在的黄色箭头弹回前景。黄色箭头指向要执行的下一行。从那里,您可以使用调试工具栏(查看工具栏;您应该有额外的按钮,蓝色我认为,看起来像播放/停止/等按钮)来逐步执行代码。您还应该看到标有“本地人”,“手表”以及您希望在一个有价值的调试器中看到的其他窗口的窗口。 :)

请注意,当程序在断点处停止或者单步执行代码时,应用程序将显示为冻结状态。 UI更新可能不会立即显示,因此,您将无法在输入框中键入任何内容或点击按钮直到您恢复(点击“播放”按钮)。