开发者

Using If...Else vs If()

Does cleanliness trump performance here:

Version 1:

Function MyFunc(ByVal param as String) As String
    Dim returnValue as String
    If param Is Nothing Then
        returnV开发者_Go百科alue = "foo"
    Else
        returnValue = param
    return returnValue

Version 2:

Function MyFunc(ByVal param as String) As String
    return If(param,"foo")

Version 1 deals directly with unboxed Strings. Version 2 deals with all boxed Objects. [If() takes a TestExpression as Object, a FalsePart as Object and returns an Object]

[can't add comments]

COMMENT: ja72, fixed my naming.

COMMENT: Marc, so you would go with Version 2?


I think clarity trumps anything.

The If(obj1,obj2) function is the null coalescing operator of VB.NET. It functions the same as obj1 ?? obj2 in C#. As such, everyone should know what it means, and it should be used where conciseness is important.

Although the If/Else statement is clean, simple, and obvious, in this particular case, I would favor the If function.


The compiler would optimize these two to the same code or nearly the same depending on the optimization level (See project properties).

Write two methods this way, compile them and use Reflector to look into the VB.Net decompiled code (or even MSIL) and you will see that there is very little (some billionth of a second) or none difference in exectuion.

Compiler optimizations generally handle normal patterns that allows you to write if-statements and loops in different ways. For instance in .Net for, foreach, while, do, etc do not actually exist. They are language specific features that are compiled down to goto-statement logic in the assembly level. Use Reflector to look at a few of these and you'll learn a lot! :)

Note that it is possible to write bad code that the compiler can't optimize to its "best state", and it is even possible to do better than the compiler. Understanding .Net assembly and MSIL means understanding the compiler better.


Really? I don't think this function is going to be a bottleneck in any application, and so just go with brevity/clarity.

I would recommend:

Public Function TXV(ByVal param As String) As String
    Return If(param Is Nothing, "foo", param)
End Function

and make sure the function returns a string (to keep type safety). BTW, why is your Function called MySub ? Shouldn't it be MyFunc ?


I believe that these two implementations are nearly the same, I would use the second one because it's shorter.


Since I come from a C background, I would opt for the ternary operator most times where it is clear what is happening - in a case like this where there is repetition and it can be idiomatic. Similarly in T-SQL where you can use COALESCE(a, b, c, d, e) to avoid having a bunch of conditionals and simply take the first non-null value - this is idiomatic and easily read.

Beware that the old IIf function is different from the new If operator, so while the new one properly handles side-effects and short-circuits, it's only one character away from a completely different behavior which people have long been wary of.

http://secretgeek.net/iif_function.asp

http://visualbasic.about.com/od/usingvbnet/a/ifop.htm

I don't think it's going to matter in terms of performance, because the optimizer is pretty good about these kind of transforms.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜