Различие в производительности между IIf () и Если

$(document).ready(function() {

    // Executes when the HTML document is loaded and the DOM is ready
    alert("Document is ready");
});

// .load() method deprecated from jQuery 1.8 onward
$(window).on("load", function() {

     // Executes when complete page is fully loaded, including
     // all frames, objects and images
     alert("Window is loaded");
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>

97
задан emlai 9 August 2015 в 22:14
поделиться

8 ответов

VB имеет следующий If оператор, к которому относится вопрос, я думаю:

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

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

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

Dim len = If(text Is Nothing, 0, text.Length)
140
ответ дан Hannele 24 November 2019 в 05:22
поделиться

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!
64
ответ дан 5 revs, 3 users 38% 24 November 2019 в 05:22
поделиться

Согласно этот парень , IIf может взять до 6x настолько же долго как Если/Тогда. YMMV.

6
ответ дан Greg Hurlman 24 November 2019 в 05:22
поделиться

Кроме того, другая большая проблема с IIf - то, что он на самом деле вызовет любые функции, которые находятся в аргументах [1], поэтому если у Вас есть ситуация как следующее:

string results = IIf(Not oraData.IsDBNull(ndx), oraData.GetString(ndx), string.Empty)

Это на самом деле выдаст исключение, которое не является, как большинство людей думает функциональные работы в первый раз, когда они видят его. Это может также привести к некоторым очень трудно для исправления ошибок в приложении также.

[1] Функция IIf - http://msdn.microsoft.com/en-us/library/27ydhh0d (По сравнению с 71) .aspx

13
ответ дан rjzii 24 November 2019 в 05:22
поделиться

... относительно того, почему это может взять пока 6x, quoth Wiki:

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

По существу IIf является эквивалентом тернарного оператора в C++/C#, таким образом, это дает Вам некоторую хорошую 1 строку, если/еще бы операторы типа, если Вы хотели бы его к. Можно также дать ему функцию, чтобы оценить, если Вы требуете.

5
ответ дан Dillie-O 24 November 2019 в 05:22
поделиться

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

кроме того, "IIF является функцией, по сравнению с будучи частью синтаксиса языков" ..., который подразумевает мне, что, действительно, Если было бы быстрее..., если ни для чего иного, чем это, Если оператор может быть сведен непосредственно к маленькому набору кодов операций вместо того, чтобы иметь необходимость перейти к другому пространству в памяти для выполнения логики, найденной в упомянутой функции. Это - банальное различие, возможно, но стоящий замечания.

6
ответ дан EdgarVerona 24 November 2019 в 05:22
поделиться

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

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

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

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

Dim Keywords = IIf(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)
7
ответ дан 24 November 2019 в 05:22
поделиться

I believe that the main difference between If and IIf is:

  • If(test [boolean], statement1, statement2) it means that according to the test value either satement1 or statement2 will executed (just one statement will execute)

  • Dim obj = IIF(test [boolean] , statement1, statement2) it means that the both statements will execute but according to test value one of them will return a value to (obj).

so if one of the statements will throw an exception it will throw it in (IIf) anyway but in (If) it will throw it just in case the condition will return its value.

6
ответ дан 24 November 2019 в 05:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: