Вопрос

Есть ли разница в производительности в Visual Basic при использовании IIf функция вместо If заявление?

Это было полезно?

Решение

В ВБ есть следующее If утверждение, к которому относится вопрос, я думаю:

' Usage 1
Dim result = If(a > 5, "World", "Hello")
' Usage 2
Dim foo = If(result, "Alternative")

Первый — это, по сути, тернарный условный оператор C#, а второй — оператор объединения (return result если это не Nothing, в этом случае возврат "Alternative"). If таким образом заменил IIf и последний устарел.

Как и в C#, условное выражение VB If оператор закорачивает, поэтому теперь вы можете безопасно написать следующее, что невозможно с помощью IIf функция:

Dim len = If(text Is Nothing, 0, text.Length)

Другие советы

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

Лучше использовать If вместо IIf, чтобы правильно использовать механизм вывода типа (Option Infer On)

В этом примере ключевые слова распознаются как строка, когда я использую If:

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

В противном случае он распознается как Object:

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

В соответствии с этот парень, IIf может занять в 6 раз больше времени, чем If/Then.ЮММВ.

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

Также, «IIF — это функция, а IF — часть синтаксиса языков»...это подразумевает для меня, что действительно, если бы было быстрее...if только для того, чтобы оператор If мог быть сведен непосредственно к небольшому набору кодов операций, вместо того, чтобы обращаться к другому пространству в памяти для выполнения логики, найденной в указанной функции.Возможно, это банальная разница, но ее стоит отметить.

Я считаю, что основная разница между If и IIf заключается в следующем:

  • Если (test [boolean], aturncy1, atervation2) это означает, что в соответствии с тестовым значением Sapement1 или оператором 2 будет выполнено (только один оператор будет выполнен)

  • Dim obj = iif (test [boolean], aturning1, atervice2) это означает, что оба утверждения будут выполняться, но в соответствии с тестовым значением один из них вернет значение (OBJ).

поэтому, если один из операторов выдаст исключение, он все равно выдаст его в (IIf), но в (If) он выдаст его на тот случай, если условие вернет свое значение.

...что касается того, почему это может занять до 6 раз, цитирует вики:

Поскольку IIF является библиотечной функцией, она всегда потребует накладных расходов функционального вызова, тогда как условный оператор, скорее всего, будет производить встроенный код.

По сути, IIf является эквивалентом тернарного оператора в C++/C#, поэтому он дает вам несколько хороших однострочных операторов типа 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 истинным или ложным, и просто присвоить значение одной из них вашей переменной.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top