9 ответов:
VB имеет следующее
Ifутверждение, на которое ссылается вопрос, я думаю:' Usage 1 Dim result = If(a > 5, "World", "Hello") ' Usage 2 Dim foo = If(result, "Alternative")первый-это в основном тернарный условный оператор C#, а второй-его оператор объединения (return
resultесли этоNothingв случае возврата"Alternative"). сменилIIfи последнее устарело.как в C#, VB условно
Ifоператор короткого замыкания, поэтому теперь вы можете безопасно написать следующее, что невозможно используяIIfфункция:Dim len = If(text Is Nothing, 0, text.Length)
IIf()работает как true и false код. Для простых вещей, таких как числовое назначение, это не имеет большого значения. Но для кода, который требует какой-либо обработки, вы тратите циклы на выполнение условия, которое не соответствует, и, возможно, вызывает побочные эффекты.иллюстрации код:
Module Module1 Sub Main() Dim test As Boolean = False Dim result As String = IIf(test, Foo(), Bar()) End Sub Public Function Foo() As String Console.WriteLine("Foo!") Return "Foo" End Function Public Function Bar() As String Console.WriteLine("Bar!") Return "Bar" End Function End Moduleвыходы:
Foo! Bar!
кроме того, еще одна большая проблема с IIf заключается в том, что он будет фактически вызывать любые функции, которые находятся в аргументах [1], поэтому, если у вас есть такая ситуация:
string results = IIf(Not oraData.IsDBNull(ndx), oraData.GetString(ndx), string.Empty)это на самом деле вызовет исключение, которое не так, как большинство людей думают, что функция работает в первый раз, когда они видят его. Это также может привести к некоторым очень трудно исправить ошибки в приложении, а также.
[1] Функция IIf - http://msdn.microsoft.com/en-us/library/27ydhh0d(против.71).аспн
лучше использовать, если вместо IIf правильно использовать механизм вывода типа (опция Infer On)
в этом примере ключевые слова распознаются как строка, когда я использую If:
Dim Keywords = If(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)в противном случае он распознается как объект :
Dim Keywords = IIf(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)
по данным этот парень, IIf может занять до 6x так долго, как если бы / тогда. МММ.
кроме того, читаемость, вероятно, должна быть более предпочтительной, чем производительность в этом случае. Даже если IIF был более эффективным, он просто менее читаем для целевой аудитории (я предполагаю, что если вы работаете в Visual Basic, вы хотите, чтобы другие программисты могли легко читать ваш код, что является самым большим преимуществом VB... и который теряется с такими понятиями, как IIF, на мой взгляд).
и "IIF-это функция, а не если она является частью языков' синтаксис"... что подразумевает для меня, что, действительно, если бы было быстрее... если только для этого оператор If может быть сведен непосредственно к небольшому набору кодов операций, а не к необходимости переходить в другое пространство в памяти для выполнения логики, найденной в указанной функции. Это банальная разница, возможно, но стоит отметить.
Я считаю, что основное различие между If и IIf:
If (test [boolean], statement1, statement2) это означает, что в соответствии с тестовым значением будет выполняться либо satement1, либо statement2 (только один оператор будет выполняться)
Dim obj = IIF (test [boolean], statement1, statement2) это означает, что оба оператора будут выполняться, но в соответствии с тестовым значением один из них вернет значение (параметр obj.)
поэтому, если один из операторов вызовет исключение, он все равно бросит его в (IIf), но в (If) он бросит его на всякий случай, если условие вернет свое значение.
...Что касается того, почему это может занять столько времени, сколько 6x, quoth The wiki:
потому что IIf-это библиотечная функция, она всегда будет требовать дополнительных издержек вызов функции, тогда как условный оператор, скорее всего, будет производить встроенный код.
по существу IIf является эквивалентом тернарного оператора в C++/C#, поэтому он дает вам несколько хороших операторов типа 1 line if / else, если вы этого хотите. Вы также можете дать ему функцию для оценки, если вы жаждать.
эти функции разные! Возможно, вам нужно только использовать оператор IF. IIF всегда будет медленнее, потому что он будет выполнять обе функции плюс он будет делать стандартный оператор IF.
Если вам интересно, почему существует функция IIF, возможно, это будет объяснение:
Sub main() counter = 0 bln = True s = iif(bln, f1, f2) End Sub Function f1 As String counter = counter + 1 Return "YES" End Function Function f2 As String counter = counter + 1 Return "NO" End Functionтаким образом, счетчик будет 2 после этого, но s будет только "да". Я знаю, что этот счетчик бесполезен, но иногда есть функции, которые вам понадобятся для запуска, не имеет значения, если это так true или false, и просто присвоить значение одного из них в переменную.
Comments