В VB.NET, почему я должен использовать Select, а не If? - PullRequest
3 голосов
/ 30 июня 2011

Я недавно закончил и начал настоящую работу.Во время нашего обучения они познакомили нас с VB.NET и многими функциями, которые они используют здесь.В некоторых примерах они использовали операторы Select (а в некоторых местах они использовались там, где действительно должен был использоваться If/Else).

Единственный раз, когда я использовалОператор switch / select на других языках (кроме назначений, которые требовали его) был, когда я хотел перейти к следующему оператору.

Учитывая, что VB.NET не имеет провала, какие (если есть) случаиможно использовать оператор Select?Есть ли случаи, когда это дает преимущества перед If/ElseIf заявлением?

Ответы [ 5 ]

10 голосов
/ 30 июня 2011

Select Case, а не просто Select.
Для меня это одна из лучших функций языка.

  1. Это гораздо более наглядно, когда у вас есть несколько возможных значений для проверки.

    select case some_var
    case 1
      something()
    case 2
      something_else()
    case 3
      etc()
    end select
    
  2. Это гораздо более читабельно, когда дело доходит до диапазонов тестирования:

    select case some_var
    case 1 to 10
      something()
    case 20 to 30
      something_else()
    case is > 100
      etc()
    end select
    
  3. Это гораздо более читабельно, когда у вас есть куча более сложных условий для проверки, убедившись, что выбрано только одно:

    select case true
    case string.isnullorempty(a_string)
      something()
    case a_string.length < 5
      something_else()
    case a_string = b_string
      etc()
    end select
    
  4. Он превосходит C / C ++ switch в том смысле, что допускает выражения как точки ветвления, а не просто константы.

  5. При использовании констант в качестве точек ветвления (пример 1) компилятор может генерировать более оптимизированный код с прямыми переходами.

6 голосов
/ 30 июня 2011

Select сообщает компилятору, что каждое сравнение (If) в аналогичном наборе блоков If / Else имеет одно и то же значение, и это позволяет ему выполнять определенные оптимизации, в которых сложнее быть уверенными в обратном.Например, возможно, было бы больше желания генерировать машинный код, содержащий это значение в регистре процессора (это просто гипотетически ... разные компиляторы могут делать то, что они хотят).

Кроме того, некоторые из нас находят Select гораздо более читабельным.Важно следовать стандартам кодирования любой команды или подразделения, в котором вы оказались.

4 голосов
/ 30 июня 2011

Во-первых, VB провалился, это не так очевидно.«Падение» в VB - это просто установка одного случая на несколько значений:

Dim number As Integer = 8
Select Case number
    Case 6,7,8
        ' do stuff
    Case Else
        ' do default stuff
End Select

Что касается его преимуществ, то гораздо проще написать один оператор Select, чем, скажем, более трех If/ElseIf операторов.что все тесты на одно и то же значение.

1 голос
/ 30 июня 2011

Если вы собираетесь делать несколько разных вещей на основе сравнения входных данных / сравнения диапазонов, если это if-elseif +, тогда используйте Select вместо сумасшедших блоков if-elseif.

Оператор Select в VB.NET также имеет несколько интересных функций, поэтому убедитесь, что вы знаете все функции.

0 голосов
/ 15 августа 2013

Существует ситуация, когда Select Case может быть намного эффективнее, чем If: когда у вас есть список предложений «Or» в условии If и вам не нужно оценивать их все, чтобы установить истинность условия. Предположим, у вас есть оператор if, такой как:

If A() Or B() Then
    DoSomething()
ElseIF C() or D() Then
    DoSomethingElse()
Else
    DoTheDefault()
EndIF

В этом случае для вычисления первого оператора if выполняются обе функции A () и B (), и аналогично для второго оператора if, когда A () и B () оба являются ложными. Если A () возвращает true, то значение B () является несущественным, и, если оно не изменяет состояние программы так, как вы этого хотите (обычно это не очень хорошая практика), выполнение B () является избыточным. Компилятор ограничен требованием, что все части теста ДОЛЖНЫ быть выполнены до заключения значения (оптимизация теста не допускается в соответствии со спецификацией языка).

Вы можете разделить условия на несколько операторов IfElse, чтобы оптимизировать его самостоятельно, но это делает код менее читабельным и увеличивает опасность ошибок при внесении изменений позже. Я считаю, что использование Select Case лучше в этой ситуации:

Select Case True
    Case A(), B()
        DoSomething()
    Case C(), D()
        DoSomethingElse()
    Case Else
        DoTheDefault()
End Select

Теперь, если A () возвращает True, тогда B () вообще не оценивается. Оценка условий производится в указанной последовательности, поэтому вы можете помочь оптимизировать код, разместив тесты в порядке наиболее вероятного возврата True или наименее затратного для выполнения (в зависимости от приложения).

...