什么时候适合使用子程序而不是函数?

时间:2017-11-06 15:08:16

标签: vb.net

今天在我的课堂上,我被告知要将一些子程序改为功能,当我问为什么老师努力回答它为何更好时,一般来说,我总是认为功能应该只是真的在返回值时使用。在下面的两个例子中;是否有一种方法应该用于另一种方法,或者无关紧要?如果它确实重要吗? 提前谢谢。

方法1(子程序):

Sub EncryptString(ByVal unkString, ByRef encryptedString)
    For i = 1 To Len(unkString)
        encryptedString += "*"
    Next
End Sub

方法2(功能): [主要是我分配变量" encryptedString"这个功能]。

Function encryptString(ByVal unkString) As String
    For i = 1 To Len(unkString)
        encryptString += "*"
    Next
End Function

3 个答案:

答案 0 :(得分:4)

您误解了他们想要告诉您的内容。在您的Function示例中没有区别。老师的期望是这样的:

Function EncryptString(ByVal unkString) As String
    Dim encryptedString As String = ""
    For i = 1 To Len(unkString)
        encryptedString += "*"
    Next
    Return encryptedString
End Function

这比修改字段,传递ByRef的参数或函数的基础变量

更简洁,更可重用。

答案 1 :(得分:1)

您的示例显示了多个原因之一,初始化数据的人不清楚。使用示例代码,第一个选项将附加到传递的字符串,而第二个选项将创建一个新字符串。

第一种方法必须指定它是否需要空字符串或解释它附加的原因。第二种方法清楚地表明将返回一个新字符串。

Sub Main()

    Dim u, e As String

    u = "123"
    e = "123"

    EncryptString1(u, e)
    Console.WriteLine(e) ' Display: 123***

    u = "123"
    e = "123"

    e = encryptString2(u)
    Console.WriteLine(e) ' Display: ***

    Console.ReadLine()

End Sub
Sub EncryptString1(ByVal unkString As String, ByRef encryptedString As String)
    For i As Integer = 1 To Len(unkString)
        encryptedString += "*"
    Next
End Sub

Function encryptString2(ByVal unkString As String) As String
    encryptString2 = ""
    For i As Integer = 1 To Len(unkString)
        encryptString2 += "*"
    Next
End Function

请严格选择。另外,就个人而言,我宁愿创建一个变量而不是使用函数名,使用.Length代替Len()并连接&而不是+。

Function encryptString3(ByVal unkString As String) As String
    Dim encryptedString As String = ""

    For i As Integer = 1 To unkString.Length
        encryptedString &= "*"
    Next

    Return encryptedString
End Function

或者只使用String类的New运算符。

Dim encryptedString as New String("*"c, unkString.Length)

答案 2 :(得分:-1)

好吧,当我学习这些东西时,总是使用函数来计算值和子函数来做其他事情。我想对于一些非常通用的东西,你使用哪种方法并不重要,正如你在你的例子中所说明的那样。有关此主题的进一步讨论,请参阅以下链接。

http://analystcave.com/vba-function-vs-vba-sub-procedures/