今天在我的课堂上,我被告知要将一些子程序改为功能,当我问为什么老师努力回答它为何更好时,一般来说,我总是认为功能应该只是真的在返回值时使用。在下面的两个例子中;是否有一种方法应该用于另一种方法,或者无关紧要?如果它确实重要吗? 提前谢谢。
方法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
答案 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)
好吧,当我学习这些东西时,总是使用函数来计算值和子函数来做其他事情。我想对于一些非常通用的东西,你使用哪种方法并不重要,正如你在你的例子中所说明的那样。有关此主题的进一步讨论,请参阅以下链接。