这样做有什么区别:
Public Sub MySub(ByVal MyString as String)
Dim TheString as String = MyString
myFunction(TheString)
'Some more code...
End Sub
与此相比:
Public Sub MySub(ByVal MyString as String)
MyFunction(MyString)
'Some more code
End Sub
也就是说,是否有充分的理由在从参数行使用变量之前再次对函数/ sub中的变量进行维度化?或者没关系?
希望这是有道理的,我不确定如何说出这个问题。
答案 0 :(得分:2)
如果它是基于值Type
(例如:string
或integer
,double
等),除非它使用参考传递(ByRef
)而不是值(ByVal
),您不必担心将其存储在另一个变量中(除非您希望有2个副本)
答案 1 :(得分:1)
如果函数需要一个修改后的字符串,那么你将它改为适合它,第一个代码块就会有所帮助。
然而 - 由于它是平等的,我能想到你需要第一块代码的唯一情况是你是否需要在该子代码中保持myString相同...但我会想想如果你做的那样,大多数时候你会有一个完全不同的子。
因为你使用了ByVal--一旦你退出那个sub,myString将再次成为你输入sub之前最初设置的东西,因为你在sub中使用的mystring只是一个副本的价值。
相反,如果您使用ByRef,对变量所做的更改将恢复到主代码并实际更改mystring的值。
您可以在此处阅读ByVal和ByRef之间的区别:http://social.msdn.microsoft.com/Forums/vstudio/en-US/07b9d3b9-5658-49ed-9218-005564e8209e/what-is-the-difference-between-byval-and-byref
您可以采用所有这些概念,并在简单的控制台程序中使用它的工作方式,以进一步理解。这就是我所做的,这里有一些我玩弄的代码来仔细检查我在说什么。尝试改变ByVal&使用了ByRef,并且可能在您进行更改后打印到屏幕上,看看有什么不粘,什么不是。
Sub Main()
Dim someString As String = "This is some string."
MySub(someString)
Console.WriteLine(someString)
MyOtherSub(someString)
Console.WriteLine(someString)
Console.ReadLine()
End Sub
Public Sub MySub(ByVal myString As String)
Dim theString As String = myString
MyFunction(theString)
' First line printed in console.
Console.WriteLine(theString)
theString = "Hello."
Console.WriteLine(theString)
Console.WriteLine(myString)
myString = "I'm mystring."
Console.WriteLine(myString)
End Sub
Public Sub MyOtherSub(ByVal MyString As String)
MyFunction(MyString)
End Sub
Public Function MyFunction(ByRef mystring As String)
mystring += "myFunction is acting on this string."
End Function