Різниця продуктивності між IIf () та If


Відповіді:


140

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)

2
Ви не відповіли на питання про ефективність, а також не згадуєте про побічні ефекти IIf.
jor

2
@jor Останній абзац моєї відповіді стосується побічних ефектів. Вистава не дуже актуальна, коли один із варіантів застарілий. Для чого він на сьогоднішній день Ifє більш ефективним, ніж IIfфункція.
Конрад Рудольф

2
@mmcrae Це правильно і цілеспрямовано: як я вже сказав, IIf застарілий, тому мало обговорювати це питання. Однак, мій останній абзац обговорює відповідну різницю. Це все, що потрібно знати, насправді.
Конрад Рудольф

2
Я вдячний, що ти хочеш підтримувати хороші стандарти та гарантувати, що новачкові не підбирають погану практику, але у когось може виникнути цілком законна проблема, яка спричинила їх бажання краще зрозуміти різницю ... Наприклад, збереження застарілого коду, затримка якийсь інший інструмент, який використовує його, тощо. І That's all you need to know, reallyце не схоже на сприятливе ставлення до веб-сайту, присвяченого обміну знаннями;)
Don Cheadle

1
@mmcrae О, я не мав на увазі бути зневажливим, я просто мав на увазі, що внутрішні органи IIf нудно тривіальні. Він просто містить звичайне твердження If, яке означає, що останній фрагмент коду в моїй відповіді не запускається.
Конрад Рудольф

65

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!

13

Крім того, ще одна велика проблема з 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, у мене виникали проблеми з IIF, але якщо збережено, додавши багато рядків коду.
NiL

7

Краще використовувати Якщо замість IIf правильно використовувати механізм виводу типу (Option Infer On)

У цьому прикладі Ключові слова розпізнаються як рядок, коли я використовую If:

Dim Keywords = If(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)

В іншому випадку він розпізнається як Об'єкт:

Dim Keywords = IIf(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)


6

На додаток до цього, читабельність, мабуть, має бути більш переважною, ніж ефективність у цьому випадку. Навіть якщо IIF був більш ефективним, він просто зрозумілий для цільової аудиторії (я припускаю, що якщо ви працюєте в Visual Basic, ви хочете, щоб інші програмісти могли легко читати ваш код, що є найбільшим благом VB ... і що втрачається з такими поняттями, як IIF, на мою думку).

Крім того, "IIF - це функція, проти чого IF є частиною синтаксису мов" ... що означає для мене, що, дійсно, If було б швидше ... якщо б не що інше, як те, що твердження If може бути зведене безпосередньо до невеликого набору опкодів, а не для того, щоб переходити до іншого простору в пам'яті для виконання логіки, знайденої у зазначеній функції. Це банальна різниця, можливо, але варто зазначити.


6

Я вважаю, що головна різниця між If і IIf полягає в:

  • Якщо (test [boolean], statement1, statement2) це означає, що відповідно до тестового значення виконується або satement1, або statement2 (буде виконуватися лише одне твердження)

  • Dim obj = IIF (test [boolean], statement1, statement2), це означає, що обидва твердження будуть виконані, але відповідно до тестового значення один з них поверне значення (obj).

тож якщо одне із висловлювань викине виняток, воно все одно кине його у (IIf), але у (If) - це викине його лише у випадку, якщо умова поверне своє значення.


5

... щодо того, чому це може зайняти 6 разів, виправте вікі:

Оскільки IIf - це функція бібліотеки, вона завжди вимагатиме накладних витрат виклику функції, тоді як умовний оператор швидше виробляє вбудований код.

По суті, IIf - еквівалент потрійного оператора в C ++ / C #, тому він дає вам декілька приємних 1-го рядка, якщо / else вводити, якщо ви хочете. Ви також можете дати йому функцію оцінювати, якщо хочете.


1

Ці функції різні! Можливо, вам потрібно використовувати лише оператор 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 є істинним або хибним, і просто призначте значення однієї з них вашій змінній.


якщо вам потрібно запустити обидва, вам слід явно зателефонувати їм обом, а потім зробити стандартний If. Використання IIf()в цьому випадку просто буде бентежити людей читає вам код.
Spivonious

Я це знаю, але питання полягає в різниці між цими двома.
титол

Я не мав на увазі, щоб коментар сприймався як критика; Я тільки вказував, що використовувати його таким чином - це не дуже добра практика.
Spivonious
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.