VB.NET:如果我通过一个字符串BYVAL到功能,但不改变字符串,我要在内存中的一个或两个字符串?
题
我知道字符串是不变的,所以你改变一个字符串的参考价值.NET分钟让堆上一个全新的字符串。
但是,如果你不这样做的变更的字符串参考价值;相反,你可以将它传递到一个函数的 ByVal
- 做此操作复制堆上的字符串值呢?我的倾向是“不”,但我想确认。
例如:
Public Function IsStringHello(ByVal test As String) As Boolean
Return (String.Compare(test, "Hello") = 0)
End Function
调用程序:
Dim myWord as String = "Blah"
Dim matchesHello as Boolean = IsStringHello(myWord)
我知道经过myWord
通过设定值,使引用以“嗒嗒”的副本,但因为我没有试图改变字符串本身,它将使堆上的字符串的另一个副本?
解决方案
顺便说,串实习是完全无关的这一点。将参数传递到函数的规则是用于所有引用类型是相同的(并且确实,所有类型),无论它们是如何内部管理。
的规则是简单的并且已经正确地说,它:按值的副本传递参考,而不是靶。没有堆空间在这里被复制。
其他提示
没有。它仍然使用所述参考强>的复制到“嗒嗒”。结果, 是什么让你觉得,它会?
在一个方面说明,字符串被拘留。
string s = "hello";
string t = "hello";
S&吨都指代相同的字符串(因为它是实习)。如果修改s或t,它会创建一个新的字符串,然后。
BYVAL创建的指针的,而不是对象本身的副本传递对象。这里的一个示范:
Module Module1
Dim original As String = "Hello world"
Sub PassByReferenceTest(ByVal other As String)
Console.WriteLine("object.ReferenceEquals(original, other): {0}", _
Object.ReferenceEquals(original, other))
End Sub
Sub Main()
PassByReferenceTest(original)
Console.ReadKey(True)
End Sub
End Module
此程序输出如下:
object.ReferenceEquals(original, other): True
因此,原始字符串和我们通过由值中的字符串在存储器地址相同的地址存在。你没有将字符串本身的副本。
时短,没有。它通过一个裁判的字符串。字符串本身的仅一个实例。
的字符串是一个引用类型。如果通过值传递给它,你正在传递的是参考的值。
你会得到堆上另一个副本的唯一方法是改变变量的值。
型System.String
的可变有效モ“对象ID”。假设Object #1934
与字符"Blah"
一个字符串,你说Dim myWord As String = "Blah"
。然后,编译器将Object #1934
存入myWord
。然后调用IsStringHello(myWord)
会导致该函数与它test
参数调用等于Object #1934
。在示例中,将有类型System.String
的两个变量在存储器中 - myWord
和test
,两者将持有内容Object #1934