Есть ли разница в производительности в Visual Basic при использовании IIf
функции вместо If
оператора?
vb.net
if-statement
iif-function
Брайан Рот
источник
источник
IIf
.If
намного эффективнее, чемIIf
функция.That's all you need to know, really
это не похоже на благоприятное отношение к веб-сайту, посвященному обмену знаниями;)IIf()
выполняет как истинный, так и ложный код. Для простых вещей, таких как числовое присвоение, это не имеет большого значения. Но для кода, требующего какой-либо обработки, вы тратите циклы на выполнение несоответствующего условия и, возможно, вызываете побочные эффекты.Иллюстрация кода:
Выходы:
источник
Кроме того, еще одна большая проблема с IIf заключается в том, что он фактически вызывает любые функции, которые находятся в arguments [1], поэтому, если у вас есть ситуация, подобная следующей:
На самом деле это вызовет исключение, что не так, как большинство людей думают, что функция работает в первый раз, когда они ее видят. Это также может привести к очень сложным для исправления ошибкам в приложении.
[1] Функция IIf - http://msdn.microsoft.com/en-us/library/27ydhh0d(VS.71).aspx
источник
Лучше использовать If вместо IIf, чтобы правильно использовать механизм вывода типа (Option Infer On)
В этом примере ключевые слова распознаются как строка, когда я использую If:
В противном случае он распознается как Объект:
источник
По словам этого парня , 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 является эквивалентом тернарного оператора в C ++ / C #, поэтому он дает вам несколько хороших 1-строчных операторов типа if / else, если вы этого хотите. Вы также можете дать ему функцию для оценки, если хотите.
источник
Эти функции разные! Возможно, вам нужно использовать только оператор IF. IIF всегда будет медленнее, потому что он будет выполнять обе функции плюс стандартный оператор IF.
Если вам интересно, почему существует функция IIF, возможно, это будет объяснением:
Таким образом, после этого счетчик будет 2, но s будет только «ДА». Я знаю, что этот счетчик бесполезен, но иногда есть функции, которые вам понадобятся для запуска, не имеет значения, истинно или ложно IF, и просто присвойте значение из одного из них вашей переменной.
источник
IIf()
просто запутает людей, читающих ваш код.