Чи є в Visual Basic різниця в продуктивності при використанні IIf
функції замість If
оператора?
Чи є в Visual Basic різниця в продуктивності при використанні IIf
функції замість If
оператора?
Відповіді:
VB має таке If
твердження, на яке йдеться в питанні:
' Usage 1
Dim result = If(a > 5, "World", "Hello")
' Usage 2
Dim foo = If(result, "Alternative")
Перший в основному є потрійним умовним оператором C #, а другий - його оператором з'єднання (повернення, result
якщо це не Nothing
, в цьому випадку повернення "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 полягає в тому, що він насправді викликає будь-які функції, які є в аргументах [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
Краще використовувати Якщо замість 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-го рядка, якщо / 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
.