使用If ... Else vs If()

时间:2011-02-08 20:06:50

标签: vb.net performance

清洁度是否胜过这里的表现:

版本1:

Function MyFunc(ByVal param as String) As String
    Dim returnValue as String
    If param Is Nothing Then
        returnValue = "foo"
    Else
        returnValue = param
    return returnValue

第2版:

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

版本1直接处理未装箱的String。版本2处理所有盒装Object。 [If()将TestExpression作为Object,将FalsePart作为Object并返回Object]

[无法添加评论]
评论:ja72,修正了我的命名 评论:Marc,你会选择第2版吗?

5 个答案:

答案 0 :(得分:7)

我认为清晰度胜过任何事情。

If(obj1,obj2)函数是VB.NET的空合并运算符。它的功能与C#中的obj1 ?? obj2相同。因此,每个人都应该知道它意味着什么,并且应该在简洁性很重要的地方使用它。

尽管If/Else语句干净,简单且明显,但在这种特殊情况下,我赞成使用If函数。

答案 1 :(得分:3)

编译器会根据优化级别将这两者优化为相同的代码或几乎相同(参见项目属性)。

以这种方式编写两个方法,编译它们并使用Reflector来查看VB.Net反编译代码(甚至是MSIL),你会看到很少(几十亿分之一秒)或者没有exectuion的差异。

编译器优化通常处理允许您以不同方式编写if语句和循环的常规模式。例如.Net for,foreach,while,do等实际上并不存在。它们是特定于语言的功能,在汇编级别编译为goto语句逻辑。使用Reflector查看其中的一些,你会学到很多东西! :)

请注意,可以编写编译器无法优化到其“最佳状态”的错误代码,甚至可以比编译器做得更好。理解.Net汇编和MSIL意味着更好地理解编译器。

答案 2 :(得分:2)

真的?我不认为这个功能会成为任何应用程序的瓶颈,所以只需简洁/清晰。

我建议:

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

并确保该函数返回一个字符串(以保持类型安全)。顺便说一下,为什么你的功能被称为MySub?不应该是MyFunc

答案 3 :(得分:1)

我相信这两个实现几乎相同,我会使用第二个实现,因为它更短。

答案 4 :(得分:0)

由于我来自C背景,我会选择三元运算符,因为很明显发生了什么 - 在这样的情况下,重复发生并且它可能是惯用的。类似地,在T-SQL中,您可以使用COALESCE(a,b,c,d,e)来避免使用一堆条件并简单地获取第一个非空值 - 这是惯用的并且易于阅读。

请注意旧的IIf功能与新的If运算符不同,所以当新的IIf功能正确处理副作用和短路时,它只有一个字符远离人们长期以来一直警惕的完全不同的行为。

http://secretgeek.net/iif_function.asp

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

我认为它在性能方面并不重要,因为优化器在这些转换方面非常出色。