VB.NET: Wenn ich einen String ByVal in eine Funktion übergeben, aber nicht die Zeichenfolge ändern, habe ich einen oder zwei Strings im Speicher?
Frage
Ich weiß, Strings sind unveränderlich, so die Minute, die Sie eine Zeichenfolge Referenzwert .NET ändern macht eine ganz neue Saite auf dem Heap.
Aber was, wenn Sie dies nicht tun Veränderung der Wert einer Zeichenfolge Referenz; vielmehr, übergeben Sie sie einfach in eine Funktion ByVal
- macht dieser Vorgang den String-Wert auf dem Heap und kopieren? Meine Neigung ist „nein“, aber ich würde bestätigen möchte.
Zum Beispiel:
Public Function IsStringHello(ByVal test As String) As Boolean
Return (String.Compare(test, "Hello") = 0)
End Function
Beim Programm:
Dim myWord as String = "Blah"
Dim matchesHello as Boolean = IsStringHello(myWord)
Ich weiß vorbei myWord
von Wert macht eine Kopie des Hinweis auf „Blabla“, aber da habe ich die Zeichenfolge ändern sich nicht versucht, es wäre eine weitere Kopie der Zeichenfolge auf dem Heap machen ?
Lösung
By the way, ist Zeichenfolge Internierung in keinem Zusammenhang zu dem. Die Regel für die Parameter an Funktionen vorbei ist das gleiche für alle Referenztypen (und wirklich, alle Typen), egal wie sie intern verwaltet werden.
Die Regel ist einfach und Sie haben es richtig gesagt: Pass von Wert kopiert die Hinweis , nicht target . Kein Heap-Speicher kopiert hier.
Andere Tipps
Nein. es immer noch verwendet die Kopie der Referenz auf die „Blah“.
Was lässt Sie denken, es wird?
Auf einer Seite zur Kenntnis, string interniert werden.
string s = "hello";
string t = "hello";
s & t beziehen sich beide auf die gleiche Zeichenfolge (weil es interniert wird). Wenn Sie s oder t ändern, wird es eine neue Zeichenfolge erstellen, dann.
Passing Objekte ByVal eine Kopie des erstellt Zeiger , nicht das Objekt selbst. Hier ist eine Demonstration:
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
Dieses Programm gibt folgende Möglichkeiten:
object.ReferenceEquals(original, other): True
Also, die ursprüngliche Zeichenfolge und die Zeichenfolge wir existieren in Speicheradresse an der gleichen Adresse als Wert übergeben. Sie sind nicht eine Kopie der Zeichenfolge selbst zu machen.
ist kurz, nein. Es passiert eine ref auf den String. Nur eine Instanz der Zeichenfolge selbst.
string ist ein Referenztyp. Wenn Sie es nach Wert übergeben, was Sie vorbei ist der Wert der Referenz.
Die einzige Möglichkeit, eine weitere Kopie auf dem Heap bekommen würde wäre, den Wert der Variablen zu ändern.
Eine Variable vom Typ System.String
hält effektiv eine "Objekt-ID". Nehmen wir an, dass Object #1934
eine Zeichenfolge mit dem Zeichen "Blah"
ist, und Sie sagen Dim myWord As String = "Blah"
. Der Compiler wird dann speichern Object #1934
in myWord
. Der Aufruf IsStringHello(myWord)
würde dann dazu führen, dass Funktion mit seinen test
Parametern gleich Object #1934
aufgerufen werden. In Ihrem Beispiel wäre es zwei Variablen vom Typ System.String
im Speicher -. myWord
und test
, und beide würden den Inhalt Object #1934
halten