Performance difference between IIf() and If

2019-01-03 06:17发布

In Visual Basic, is there a performance difference when using the IIf function instead of the If statement?

9条回答
Evening l夕情丶
2楼-- · 2019-01-03 06:45

...as to why it can take as long as 6x, quoth the wiki:

Because IIf is a library function, it will always require the overhead of a function call, whereas a conditional operator will more likely produce inline code.

Essentially IIf is the equivalent of a ternary operator in C++/C#, so it gives you some nice 1 line if/else type statements if you'd like it to. You can also give it a function to evaluate if you desire.

查看更多
女痞
3楼-- · 2019-01-03 06:46

Also, another big issue with the IIf is that it will actually call any functions that are in the arguments [1], so if you have a situation like the following:

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

It will actually throw an exception, which is not how most people think the function works the first time that they see it. This can also lead to some very hard to fix bugs in an application as well.

[1] IIf Function - http://msdn.microsoft.com/en-us/library/27ydhh0d(VS.71).aspx

查看更多
\"骚年 ilove
4楼-- · 2019-01-03 06:47

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.

查看更多
Juvenile、少年°
5楼-- · 2019-01-03 06:52

VB has the following If statement which the question refers to, I think:

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

The first is basically C#'s ternary conditional operator and the second is its coalesce operator (return result unless it’s Nothing, in which case return "Alternative"). If has thus replaced IIf and the latter is obsolete.

Like in C#, VB's conditional If operator short-circuits, so you can now safely write the following, which is not possible using the IIf function:

Dim len = If(text Is Nothing, 0, text.Length)
查看更多
啃猪蹄的小仙女
6楼-- · 2019-01-03 06:52

According to this guy, IIf can take up to 6x as long as If/Then. YMMV.

查看更多
狗以群分
7楼-- · 2019-01-03 07:02

Better use If instead of IIf to use the type inference mechanism correctly (Option Infer On)

In this example, Keywords is recognized as a string when I use If :

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

Otherwise, it is recognized as an Object :

Dim Keywords = IIf(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)
查看更多
登录 后发表回答