2014-02-07 4 views
3

У меня есть задача на работе, чтобы переписать старый код VB в C# и я наткнулся на этотЕсть ли разница между вложенными и не вложенными else/else ifs?

If (termNumber = TermNumberCode.FallWinter) Then 
    Dim first_term As String = " ((Course.dbo.CourseList.[Year])[email protected]) AND ((Course.dbo.CourseList.TermNumber)=3) " 

    Dim second_term As String = " ((Course.dbo.CourseList.Year)[email protected]+1) AND ((Course.dbo.CourseList.TermNumber)=1) " 
    query &= " AND ((" & first_term & ") OR (" & second_term & ")) " 

Else 
    If (termNumber = TermNumberCode.Summer) Then 
     query &= " AND ((Course.dbo.CourseList.[Year])[email protected]) AND ((Course.dbo.CourseList.TermNumber)=2) " 

    ElseIf (termNumber = TermNumberCode.Fall) Then 
     query &= " AND ((Course.dbo.CourseList.[Year])[email protected]) AND ((Course.dbo.CourseList.TermNumber)=3) " 

    ElseIf (termNumber = TermNumberCode.Winter) Then 
     query &= " AND ((Course.dbo.CourseList.[Year])[email protected]) AND ((Course.dbo.CourseList.TermNumber)=1) " 

    End If 
End If 

мне было интересно ли это то же самое, как писать это так, или если есть какое-либо особое значение или вложение если так?

If (termNumber = TermNumberCode.FallWinter) Then 
    code... 

Else if (termNumber = TermNumberCode.Summer) 
    code... 

Else If (termNumber = TermNumberCode.Fall) 
    code... 

Else //(termNumber = TermNumberCode.Winter) 
    code... 
+1

Вы задумывались над переходом на «Выбрать случай»? – OneFineDay

ответ

3

Форма

if #1..  
else 
    if #2.. 
    else if #3.. 
    else .. 
end 

эквивалентно

if #1.. 
else if #2.. 
else if #3.. 
else .. 

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

Однако в представленном коде else и окончательный else if транспонируется, который не будет иметь значение, если termNumber если ограничены в наборе сверяется. Но это is разница - что, если termNumber TermNumberCode.SpringBreak? - и, следовательно, его следует рассматривать отдельно от трансформации выше.

+0

Спасибо, это имело большой смысл. – 173901

+0

@ 173901 Cool :) Хорошая работа по использованию параметров с «динамическим запросом»! Многие программисты будут вставлять значения непосредственно в строку SQL .. yech! Вы можете продолжить это разделение, чтобы упростить динамический запрос. для отдельных терминов просто нужно привязать к termNumber. – user2864740

1

Они функционально идентичны.

+1

только потому, что этот пост, скорее всего, будет отмечен как некачественный, можете ли вы уточнить, что вы имеете в виду. Ответы на четыре слова обычно лучше оставляются в качестве комментариев. – KyleMit

+2

@KyleMit Это ответ на вопрос. Это полно. Больше нечего объяснять; делать это было бы просто шумом. Остальные два ответа просто говорят об этом, а затем переходят к разговору о том, что совсем не в этом вопросе, только затушевывая фактический ответ. У некоторых вопросов есть простые ответы. – Servy

+0

Достаточно честный. Он появился в очереди просмотра, и на первый взгляд казалось, что он может использовать дополнительную информацию. Если я буду носить обувь OP, это просто не убедит меня ни в чем. Ознает ли OP то, что означает, что что-то «функционально идентично»? Утверждение этого * * отвечает на вопрос, но я все равно остался бы без подсказки * почему *. – KyleMit

2

Предполагая, что у вас нет какого-либо кода за пределами внутреннего If/End If, они фактически эквивалентны.

1

Эту эквивалентность легче увидеть на языках C-стиля. В этих языках нет ключевого слова «else if» - это только отформатированная комбинация «else» и «if». Другими словами, до тех пор, пока у вас есть «if» и «else» на языке, где пустое пространство несущественно, вы всегда получаете «else if».

В VB, однако, есть ключевое слово «ElseIf», и у вас есть все эти «End If», поэтому это не просто перестановка белого пространства. Но у вас все еще есть базовая эквивалентность между «Else
If» и «ElseIf».

0

VB.NET имеет два стиля синтаксиса для if и else. Первый стиль имеет первое контролируемое утверждение, которое следует сразу после Then или Else без промежуточного двоеточия или конца строки. Эффект условного будет простираться до конца строки. В этом стиле запрещено использование End If.

Второй стиль имеет конец линии или двоеточие сразу после Then или Else. В этом стиле состояние затронет все до следующего Else, ElseIf, или End If. Обратите внимание, что в этом стиле строки не значительны; можно указать несколько Then, Else, ElseIf и End If операторов на одной строке.

Чтобы избежать разбора путаницы, некоторые комбинации стилей запрещены. В частности, нет If, Then, , или Else второго стиля может управляться If первого стиля, и любой Else должен использовать тот же стиль, что и его соответствие Then.Ключевое слово ElseIf разработано таким образом, чтобы обойти эти ограничения, поскольку оно рассматривается как часть конструкции второго типа If/Then, а не в качестве первого стиля Else. Обратите внимание, что можно написать Else : If ... Then, используя конструкцию второго стиля, но для и Else потребуются отдельные операторы End If. Кроме того, обратите внимание, что если вы используете первый стиль if/then и включаете If в качестве первого оператора Else, требуется пробел между Else и If.

Смежные вопросы