Путать с подходами If и отладкой - PullRequest
0 голосов
/ 27 февраля 2012

Я чрезвычайно новичок в Visual Studio 2010.

Для моего класса мне нужно сделать калькулятор.Требование для этой проблемы состоит в том, что если A или B равны нулю, тогда программа фактически не вычисляет A или B;вместо этого программа присваивает значение переменной, отличное от нуля, как результат, и если они оба равны нулю, просто сделайте ответ равным нулю.

Вот мой код:

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. Являются ли утверждения хорошими для этого, или Try / Catch будет лучше?
  2. Поскольку ответ автоматически будет правильным, даже есликод неправильный (например, 9 + 0 будет девять независимо от того, действительно ли работает If или Try / Catch или нет), они являются правильной пошаговой отладкой.Какой оптимальный способ сделать это?У меня было одно меню, в котором все отображалось шаг за шагом в зависимости от того, как работала программа, но по какой-то причине я не могу найти окно после того, как закрыл его.Я хочу видеть это шаг за шагом, пока я отлаживаю с точками останова.

Любые другие советы о хорошем синтаксисе для этих типов условных операторов?

Извините за глупое звучание;Я не смог найти здесь темы, которые бы охватили этот тип проблемы.

1 Ответ

1 голос
/ 27 февраля 2012

ОК ... во-первых, вам вообще не нужны If с. (Identity Property of Addition: для любых x, x + 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

Если по какой-то глупой причине вам действительно, действительно, действительно нужно все это Если дерьмо, вы захотите использовать 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

Но это пустая трата - и что еще хуже, если смысл добавить два числа, это неправильно. Кто-то может поставить «Я люблю сыр» в первую коробку и «ЯАААААААЙ !!!» в другом, и результатом будет «ЯАААААААЙ !!!». Ясно, что не должно происходить.

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. Пожалуйста. Все это неявное кастинг дает мне воли. Обратите внимание, что это, вероятно, добавит около десятка ошибок в ваш список ... но это хорошо вещь. Нужно знать, когда они пытаются поместить число в строковую переменную и т. Д., Потому что там происходит много магии, о которой (по моему мнению) люди должны знать больше.


К, теперь, что касается отладки ... если вы следовали моему совету до этого момента, вам не нужно было бы отлаживать. Исключения исчезли, и код станет более правильным, прежде чем вы сможете его скомпилировать. Но если вам все еще нужно, один из способов пошагового выполнения программы - установить точку останова либо на самой строке Function, либо на первой строке, которая не является объявлением. (Щелкните левое поле рядом с линией. На том месте, где вы щелкнули, должен появиться красный шарик. Это даст вам понять, что там есть точка останова.) Возможно, вы также можете попытаться установить точку прерывания в объявлениях, но я помните, что точка останова должна быть либо на следующей строке, которая на самом деле что-то делает, либо в начале функции. Я забыл, что, и на этой машине нет VS для проверки.)

Когда вы запускаете программу из VS, она запускается, и когда она достигает точки останова, VS возвращается на передний план с желтой стрелкой, где находится красный шар. Эта желтая стрелка указывает на следующую строку, которая будет выполнена. Оттуда вы можете использовать панель инструментов отладки (посмотрите на панели инструментов; у вас должны быть дополнительные кнопки, я думаю, синие, которые выглядят как кнопки play / stop / etc), чтобы пройти по коду. Вы также должны увидеть окна с надписями «Местные», «Часы» и другие окна, которые вы ожидаете увидеть в стоящем отладчике. :)

Просто имейте в виду, что пока программа останавливается на точке останова или выполняет пошаговый код, приложение будет зависать. Обновления пользовательского интерфейса, вероятно, не появятся сразу, и, следовательно, вы не сможете ничего вводить в поля ввода или нажимать кнопку, пока не возобновите (нажмите кнопку воспроизведения).

...