VB.NET:如果我将String 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会产生对“Blah”的引用的副本,但是由于我没有尝试更改字符串本身,它是否会在堆上创建另一个字符串副本?

顺便说一下,字符串实习与此完全无关.将参数传递给函数的规则对于所有引用类型(实际上是所有类型)都是相同的,无论它们如何在内部进行管理.

规则很简单,您已正确说明:按值传递复制引用,而不是目标.这里没有复制堆空间.

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...