область видимости переменной результата vb.net tryparse

Меня не устраивает то, что tryparse требует от вас заранее объявить выходную переменную, поскольку область действия этой переменной слишком широка. Есть ли лучший способ справиться с этими ситуациями?

Первый пример:

Dim tempDate As Date
If Date.TryParse(TextBox08.Text, tempDate) Then
    MonthCalendar1.SetDate(tempDate)
End If
' This code is just a part of a larger function.
' I don't need to use the tempDate in the block where it is declared.
' I only need it inside the if statement and if block.

Второй пример:

If Date.TryParse(TextBox08.Text, Nothing) Then
    MonthCalendar1.SetDate(Date.Parse(TextBox08.Text))
End If
' Now I'm parsing the textbox twice . . .

Третий пример:

If Date.TryParse(TextBox08.Text, tempDate) Then
    Dim tempDate As Date
    MonthCalendar1.SetDate(tempDate)
End If

' Or

If Date.TryParse(TextBox08.Text, Dim tempDate As Date) Then
    MonthCalendar1.SetDate(tempDate)
End If
' These would be ideal, but of course they don't compile.

Я копаю слишком глубоко здесь? Может быть, компилятор сам решает эту проблему? Я просто чувствую, что пишу неэффективный код в любом случае, я решу справиться с этим.

Редактировать 1:

Если бы я адаптировал предложение jh00ker к моей ситуации, мой код выглядел бы так:

Private Sub TextBox08_GotFocus(sender As Object, e As EventArgs) Handles TextBox08.GotFocus
    'Some Code
    Call SetMonthCalendar()
    'More Code
End Sub

Private Sub SetMonthCalendar()
    Dim tempDate As Date
    If Date.TryParse(TextBox08.Text, tempDate) Then
        MonthCalendar1.SetDate(tempDate)
    End If
End Sub

Это кажется разумным? Он выполняет то, что я хотел, но почти кажется, что решение сложнее, чем проблема.


person OdinSonnah    schedule 17.03.2014    source источник
comment
Локальная переменная, объявленная и используемая по совершенно уважительной причине, вряд ли является признаком неэффективности.   -  person Steve    schedule 17.03.2014
comment
@Steve Меня не столько расстраивает существование локальной переменной, сколько ее размещение в коде и, следовательно, ее область действия. Почему каждая часть более крупной функции должна иметь доступ к переменной, которая используется только с одним блоком if? Это та часть, которую я считаю неэффективной. Хотя я интерпретирую ваш комментарий как да, я копаю слишком глубоко.   -  person OdinSonnah    schedule 20.03.2014
comment
Да, вероятно, вы действительно копаете, чтобы найти то, чего не существует. Возможно, если у вас есть очень большая функция, лучше приложить некоторые усилия, чтобы разделить ее на более мелкие логические части, даже если вы вызываете эти подпрограммы только один раз. Прокомментируйте каждую подпрограмму соответствующим образом для дальнейшего использования, и проблема этой переменной будет естественным образом удалена.   -  person Steve    schedule 20.03.2014


Ответы (1)


Стив прав, нет ничего плохого в том, чтобы объявить переменную для работы. Разбор строки в переменную даты является законной работой. Сборка мусора справится с остальным.

Единственная альтернатива, о которой я могу думать, это что-то вроде приведенного ниже кода, который на самом деле может сбить с толку другого разработчика, который будет смотреть на ваш код в будущем.

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    If SetMonthCalendar(TextBox1.Text, MonthCalendar1) = False Then
        MessageBox.Show("Bad Date")
    End If
End Sub

Private Function SetMonthCalendar(value As String, calendar As MonthCalendar) As Boolean
    Dim tempDate As Date
    If Date.TryParse(value, tempDate) Then
        calendar.SetDate(tempDate)
        Return True
    Else
        Return False
    End If
End Function
person PJSimon    schedule 17.03.2014
comment
Я рассматривал подпрограмму, которая изолирует локальную переменную от остальной части функции, но не был уверен, стоит ли это делать, поскольку изменение области действия переменной было бы единственной причиной для нового метода. Я вообще не собираюсь ничего делать в случае сбоя TryParse, поэтому в моем случае я бы не стал использовать другой оператор if, чтобы поймать ошибку в методе Button1_Click. - person OdinSonnah; 20.03.2014