Если, IIf() и If()

Недавно я задал вопрос о IIf vs. If и выяснил, что в VB есть еще одна функция, называемая If, которая в основном делает то же самое, что IIf, но это короткое замыкание.

Эта функция Если работает лучше, чем функция IIf? Вызывает ли оператор If функции If и IIf?

Ответ 1

Черт, я действительно думал, что вы все время говорили об операторе.;-) Во всяком случае...

Является ли эта функция If более эффективной, чем функция IIf?

Конечно. Помните, что он встроен в язык. Необходимо оценивать только один из двух условных аргументов, что потенциально экономит дорогостоящую операцию.

Вызывает ли оператор If функции If и IIf?

Я думаю, вы не можете сравнить эти два, потому что они делают разные вещи. Если ваш код семантически выполняет задание, вы должны подчеркнуть это, а не принимать решения. Используйте оператор If здесь вместо инструкции. Это особенно верно, если вы можете использовать его при инициализации переменной, потому что иначе переменная будет инициализирована по умолчанию, что приведет к более медленному коду:

Dim result = If(a > 0, Math.Sqrt(a), -1.0)

' versus

Dim result As Double ' Redundant default initialization!
If a > 0 Then
    result = Math.Sqrt(a)
Else
    result = -1
End If

Ответ 2

Один очень важный различие между IIf() и If() заключается в том, что при Option Infer On более поздняя версия будет неявно приводить результаты к одному и тому же типу данных в некоторых случаях, где IIf вернет Object.

Пример:

    Dim val As Integer = -1
    Dim iifVal As Object, ifVal As Object
    iifVal = IIf(val >= 0, val, Nothing)
    ifVal = If(val >= 0, val, Nothing)

Выход:
iifVal имеет значение Nothing и тип объекта
ifVal имеет значение 0 и тип Integer, b/c он неявно преобразовывает Nothing в Integer.