VB.NET: Wenn ich einen String ByVal in eine Funktion übergeben, aber nicht die Zeichenfolge ändern, habe ich einen oder zwei Strings im Speicher?

StackOverflow https://stackoverflow.com/questions/1050590

  •  20-08-2019
  •  | 
  •  

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 ?

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top