ここでは、再帰的な手順を行っています。が再帰プロシージャ (または) にHashtable
渡されるたびに、プロシージャを終了してもメモリに残っているようです。文字列は、プロシージャが呼び出されるたびにメモリに残りますが、渡されるため、プロシージャを終了すると消えます。2 つのオブジェクトの扱いが異なるのでしょうか、それとも私の理解が間違っていますか?ByVal
ByRef
ByVal
の最後でform1_load
、渡されたのが ref であるか byval であるかに関係なく、ht.count が常に 4 になるのはなぜですか?
ht.count と str の長さはどちらも byval で渡されるため、常に同じにする必要があると考えていました。なぜこれは真実ではないのですか?
助けてくれてありがとう、理解しようとしてくれてありがとう!もっと明確にする必要がある場合はお知らせください。
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim ht As New Hashtable
Dim i As Integer = 1
Dim str As String = ""
go(ht, str, i)
MsgBox("strLen = " & Len(str) & vbCrLf & "htCount = " & ht.Count)
End Sub
Private Sub go(ByVal ht As Hashtable, ByVal str As String, ByVal i As Integer)
str = str & "0"
ht.Add(i, 0)
i = i + 1
If i < 5 Then
go(ht, str, i)
End If
End Sub
編集:私は新しいので、自分の質問に答えることができませんでした。
不思議に思っている人のために、可変オブジェクトがプロシージャ byref または byval に渡される方法を理解しようとしていることに気付きました。ht2 を追加したところ、go プロシージャは ht を ht2 に割り当てるだけになりました。
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim ht As New Hashtable
Dim ht2 As New Hashtable
Dim i As Integer = 1
Dim str As String = ""
go(ht, str, i, ht2)
MsgBox("strLen = " & Len(str) & vbCrLf & "htCount = " & ht.Count & vbCrLf & "ht2Count = " & ht2.Count)
End Sub
Private Sub go(ByVal ht As Hashtable, ByVal str As String, ByVal i As Integer, ByVal ht2 As Hashtable)
str = str & "0"
ht.Add(i, 0)
ht2 = ht
i = i + 1
If i < 5 Then
go(ht, str, i, ht2)
End If
End Sub
現在、ht2 はプロシージャに渡される方法に依存しており、ht2.count は常に str の長さと同じである必要があります。また、これは私が理解するのに役立ちました: http://en.wikipedia.org/wiki/Reference_type