Выполнить присваивание в условном IF в VB.NET? - PullRequest
2 голосов
/ 19 марта 2012

Есть ли способ установить переменную в VB.NET в операторе IF. Я хотел бы сделать следующее:

If (TypeOf sender Is TabControl And TypeOf e.Control Is TabPage) Then   'tab control is adding a tab page
    AddControl(CType(e.Control, TabPage))
ElseIf (TypeOf sender Is TabPage) Then                                  'tab page is adding some control
    AddControl(CType(sender, TabPage), e.Control)
ElseIf (tabPageFound = FindTabPageOf(sender)) IsNot Nothing Then
    tabPageFound.SomeAction()
End if

Есть ли какой-нибудь способ заставить последний "ElseIf" работать? Я знаю, что могу переписать его, чтобы заставить его работать, но есть ли какой-то синтаксис, который заставит его работать так, как есть?

Ответы [ 3 ]

3 голосов
/ 19 марта 2012

Я не использую VB.NET (так что учтите синтаксические ошибки).Тем не менее, обратите внимание, что каждое «else if» может быть тривиально переписано как «else» с вложенным «if».Многие языки, например, основанные на C-синтаксисе, не имеют составного оператора «else if», но имеют более приятную поддержку операторов «висящего if».

В этом случае его можно переписать так:

If (TypeOf sender Is TabControl And TypeOf e.Control Is TabPage) Then
    ...
ElseIf (TypeOf sender Is TabPage) Then
    ...
Else
    tabPageFound = FindTabPageOf(sender)
    If (tabPageFound) IsNot Nothing Then
        ...
    End
End If

Просто кое-что рассмотреть.


Для полноты картины показано удаление всего использования ElseIf и полученная в результате вложенность:

If (TypeOf sender Is TabControl And TypeOf e.Control Is TabPage) Then
    ...
Else
    If (TypeOf sender Is TabPage) Then
        ...
    Else
        tabPageFound = FindTabPageOf(sender)
        If (tabPageFound) IsNot Nothing Then
            ...
        End If
    End If
End If
3 голосов
/ 19 марта 2012

Нет, Visual Basic не поддерживает этот синтаксис.

Ваша единственная возможность - передать переменную byref методу, который назначит ее и вернет соответствующее значение.

Например:

Function DoFindTabPageOf(ByRef tabPageFound As Control, sender As Object) As Control
    tabPageFound = FindTabPageOf(sender)
    Return tabPageFound
End Function

Тогда ваш ElseIf становится:

ElseIf (DoFindTabPageOf(tabPageFound, sender) IsNot Nothing Then
1 голос
/ 20 марта 2012

Я знаю, что это вызывает FindTabPageOf дважды, но это можно сделать, как показано ниже. Это становится более вредным, если вы хотите где-нибудь использовать tabPageFound.

If (TypeOf sender Is TabControl And TypeOf e.Control Is TabPage) Then   'tab control is adding a tab page
    AddControl(CType(e.Control, TabPage))
ElseIf (TypeOf sender Is TabPage) Then                                  'tab page is adding some control
    AddControl(CType(sender, TabPage), e.Control)
ElseIf (FindTabPageOf(sender) IsNot Nothing) Then
    FindTabPageOf(sender).SomeAction()
End if
...