我有时会在同一个函数中混用这两种方法。个人而言,我更喜欢使用 return。
我的问题是,这两者之间有什么内部区别(如果有的话)?
区别在于它们执行不同的任务!
“返回值”有两个作用:
1. 设置函数在该点的返回值
2. 立即退出函数
函数中没有其他代码会执行!
“函数名 = 值”只有一个作用:
1. 在该点设置函数返回值
函数中的其他代码将继续执行,这使得可以使用其他逻辑来优化或覆盖函数的返回值。
这是很大的区别。请记住,这不仅与状态有关,也与流程有关。
让我们来看一下...奇怪的是"functionName ="生成更少的IL代码?
代码:
Public Function Test() As String
Test = "Test"
End Function
Public Function Test2() As String
Return "Test"
End Function
IL:
.method public static string Test() cil managed
{
.maxstack 1
.locals init (
[0] string Test)
L_0000: nop
L_0001: ldstr "Test"
L_0006: stloc.0
L_0007: ldloc.0
L_0008: ret
}
.method public static string Test2() cil managed
{
.maxstack 1
.locals init (
[0] string Test2)
L_0000: nop
L_0001: ldstr "Test"
L_0006: stloc.0
L_0007: br.s L_0009
L_0009: ldloc.0
L_000a: ret
}
这两者可能没有区别。据我所知,编译器生成的IL会将它们都转换为Return语句,除非还有额外使用_returnValue变量。
依我之见,FunctionName赋值的可读性很差,是VB6的坏习惯之一。我更喜欢使用_returnValue(而不是RETVAL)变量的方法。
下面的操作仅适用于Visual Basic 6.0开发人员,以便轻松移植代码:
Public Function MyFunction() As String
MyFunction = "Hello"
End Function
如果你的项目中包括没有使用过Visual Basic 6.0的人,我绝对不建议继续使用这种语法,因为它会让他们感到困惑。
' Code Lens reports "0 references" here for Sub Rosa().
Public Sub Rosa()
Diagnostics.Debug.WriteLine(Test())
Diagnostics.Debug.WriteLine(Test2())
End Sub
' Code Lens reports "2 references" here for Function Test().
Public Function Test() As String
Test = "Test" ' Code Lens counts this as a reference.
End Function
' Code Lens reports "1 reference" here for Function Test2().
Public Function Test2() As String
Dim strTest2 as String = "Test"
Return strTest2 ' Code Lens does NOT count this as a reference.
End Function
99次中有99次我会使用“返回值”。
偶尔我会有一个函数,另一种类型不仅可以让我节省变量声明,而且以一种实际上显着澄清函数的方式来完成。通常情况下,当我想要将返回值命名为与函数相同的名称时,这种情况就会发生,并且通常这些都是递归函数;这种结构的某些方面使其倾向于隐式返回变量。然而,这种情况非常罕见。我不知道在我的当前项目中是否有任何使用隐式返回变量的函数。
读到一个文章说返回值语法是.NET的唯一正确方式,我想“好吧,那我们就这样做吧”。然后我写了一个函数,我知道,心里清楚,无论什么情况下,它总会从Return语句中返回一个值或者抛出一个异常,但是编译器却警告说函数“并非所有路径都返回一个值”。
幸运的是,我在Stack Overflow上遇到了这个问题:如何使这个函数不产生“并非所有路径都返回值”的警告? 它解释了为什么;在函数头部添加默认值赋值给过程名称可以防止类似情况的警告。
因此,尽管我将继续使用返回值语法,只是为了保持语法的一致性,但我也会给函数名称分配一个默认值,以防止可能会使编译过程混乱的虚假警告。
当与第三方工厂(_hsf)合作时,这非常方便,您可以避免声明返回变量。
Public Function CreateExtremum(iShape As INFITF.Reference, iDir1 As HybridShapeTypeLib.HybridShapeDirection, iSide1 As Integer, iDir2 As HybridShapeTypeLib.HybridShapeDirection, iSide2 As Integer, iDir3 As HybridShapeTypeLib.HybridShapeDirection, iSide3 As Integer) As HybridShapeTypeLib.HybridShapeExtremum
CreateExtremum = _hsf.AddNewExtremum(iShape, iDir1, iSide1)
CreateExtremum.Direction2 = iDir2
CreateExtremum.ExtremumType2 = iSide2
CreateExtremum.Direction3 = iDir3
CreateExtremum.ExtremumType3 = iSide3
CreateExtremum.Compute()
End Function