1

ここでは、再帰的な手順を行っています。が再帰プロシージャ (または) にHashtable渡されるたびに、プロシージャを終了してもメモリに残っているようです。文字列は、プロシージャが呼び出されるたびにメモリに残りますが、渡されるため、プロシージャを終了すると消えます。2 つのオブジェクトの扱いが異なるのでしょうか、それとも私の理解が間違っていますか?ByValByRefByVal

の最後で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

4

2 に答える 2

0

Strings とHashTables はどちらも参照型です。あなたの場合の主な違いは、それらの可変性です。

Strings は不変です。を「編集」するたびStringに、ヒープ上の新しいメモリ位置に新しいものを作成しています。

HashTables は可変であるため、要素を追加/削除しても、まったく新しいHashTable. ヒープ上の以前の場所にとどまります。

于 2013-06-27T16:15:32.557 に答える
-1

これら 2 つのオブジェクトの扱いは異なりません。問題は、それらをどのように使用しているかです。文字列の連結は文字列を変更しません。連結された値を持つ新しい文字列を返すだけです。ただし、Hashtable.Add() はオブジェクトを変更します。

ByRef を理解するのは少し難しいです。参照しているオブジェクトを変更しているため、String の ByRef は期待どおりに動作します。ただし、テーブルにメッセージを送信しているため、Hashtable の ByRef は期待どおりに動作しません。Hashtable.Add は、テーブルに次のことを伝えます: これをコレクションに追加します。したがって、常に同じオブジェクトを扱っています。

したがって、ここでの違いは、String の複数のコピーを作成して参照を変更しているのに対し、Hashtable のコピーは 1 つしかなく、その内容を変更していることです。

于 2013-06-27T17:24:36.847 に答える