Есть ли разница в производительности в Visual Basic при использовании IIf
функции вместо If
оператора?
Есть ли разница в производительности в Visual Basic при использовании IIf
функции вместо If
оператора?
Ответы:
If
Я думаю, что у VB есть следующее утверждение, к которому относится вопрос:
' Usage 1
Dim result = If(a > 5, "World", "Hello")
' Usage 2
Dim foo = If(result, "Alternative")
Первый - это, по сути, тернарный условный оператор C #, а второй - его оператор объединения (return, result
если он не используется Nothing
, и в этом случае return "Alternative"
). If
был заменен, IIf
и последний устарел.
Как и в C #, условный If
оператор VB сокращает работу, поэтому теперь вы можете безопасно написать следующее, что невозможно с помощью IIf
функции:
Dim len = If(text Is Nothing, 0, text.Length)
If
намного эффективнее, чем IIf
функция.
That's all you need to know, really
это не похоже на благоприятное отношение к веб-сайту, посвященному обмену знаниями;)
IIf()
выполняет как истинный, так и ложный код. Для простых вещей, таких как числовое присвоение, это не имеет большого значения. Но для кода, требующего какой-либо обработки, вы тратите циклы на выполнение несоответствующего условия и, возможно, вызываете побочные эффекты.
Иллюстрация кода:
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 заключается в том, что он фактически вызывает любые функции, которые находятся в arguments [1], поэтому, если у вас есть ситуация, подобная следующей:
string results = IIf(Not oraData.IsDBNull(ndx), oraData.GetString(ndx), string.Empty)
На самом деле это вызовет исключение, что не так, как большинство людей думают, что функция работает в первый раз, когда они ее видят. Это также может привести к очень сложным для исправления ошибкам в приложении.
[1] Функция IIf - http://msdn.microsoft.com/en-us/library/27ydhh0d(VS.71).aspx
Лучше использовать If вместо IIf, чтобы правильно использовать механизм вывода типа (Option Infer On)
В этом примере ключевые слова распознаются как строка, когда я использую If:
Dim Keywords = If(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)
В противном случае он распознается как Объект:
Dim Keywords = IIf(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)
По словам этого парня , IIf может занимать до 6 раз больше, чем If / Then. YMMV.
Кроме того, в этом случае удобочитаемость, вероятно, должна быть более предпочтительной, чем производительность. Даже если бы IIF был более эффективным, он просто менее читаем для целевой аудитории (я предполагаю, что если вы работаете с Visual Basic, вы хотите, чтобы другие программисты могли легко читать ваш код, что является самым большим благом VB ... и который, на мой взгляд, теряется с такими концепциями, как IIF).
Кроме того, «IIF - это функция, в отличие от IF, являющейся частью синтаксиса языков» ... что подразумевает для меня, что, действительно, If будет быстрее ... если бы ни для чего иное, кроме этого, оператор If может быть сокращен напрямую к небольшому набору кодов операций, вместо того чтобы переходить в другое место в памяти для выполнения логики, найденной в указанной функции. Разница, может быть, банальная, но стоит отметить.
Я считаю, что основное различие между If и IIf:
Если (test [boolean], statement1, statement2), это означает, что в соответствии с тестовым значением будет выполнено либо satement1, либо statement2 (будет выполняться только один оператор)
Dim obj = IIF (test [boolean], statement1, statement2) означает, что оба оператора будут выполняться, но в соответствии с тестовым значением один из них вернет значение в (obj).
поэтому, если один из операторов вызовет исключение, он все равно выбросит его в (IIf), но в (If) он выбросит его на всякий случай, если условие вернет свое значение.
... относительно того, почему это может занять до 6 раз, говорится в вики:
Поскольку IIf - это библиотечная функция, она всегда требует дополнительных затрат на вызов функции, тогда как условный оператор, скорее всего, создаст встроенный код.
По сути, IIf является эквивалентом тернарного оператора в C ++ / C #, поэтому он дает вам несколько хороших 1-строчных операторов типа 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 будет только «ДА». Я знаю, что этот счетчик бесполезен, но иногда есть функции, которые вам понадобятся для запуска, не имеет значения, истинно или ложно IF, и просто присвойте значение из одного из них вашей переменной.
IIf()
просто запутает людей, читающих ваш код.
IIf
.