清洁度是否胜过这里的表现:
版本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版吗?
答案 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
我认为它在性能方面并不重要,因为优化器在这些转换方面非常出色。