Frage

ich wandere zwischen C ++ und VB.NET in meiner Codierung Ventures ..., die zur gelegentlichen Verwirrung führt, wann etwas von Wert oder als Referenz in VB.NET.

Lassen Sie uns zum Beispiel sagen, dass ich eine Reihe von MyObject haben, die mit einem Bündel von Objekten bevölkert wird.

dim MyArr(5000) of MyObject

Lassen Sie uns jetzt sagen, dass die Informationen aus dieser Reihe über verschiedene Datenstrukturen reist:

dim MyList as new List(of MyObject)
for i as integer = 0 to 5000 step 1000
  Mylist.add(MyArr(i))
next

dann

dim MyTable as new HashTable
dim i as integer = 0
for each O as MyObject in Mylist
  if i mod 2 = 0 then
     MyTable.add(O.ToString(), O)
  end if
next

Unter dem obigen Szenario, glaube ich alles durch Referenz. Wenn ich einen Eintrag aus „MyTable“ extrahieren und ändern ihre MyObject Mitglieder, glaube ich, dass das Original in myArr wird geändert werden.

Allerdings habe ich in Situationen führen, wo ich dachte, dass etwas durch Bezugnahme war, und es war von Wert.

Sind Gegenstände Behälter durch Bezugnahme immer hinzugefügt, oder werden sie manchmal hinzugefügt von Wert?

Ich bin verwirrt.

War es hilfreich?

Lösung

Es ist nicht ein Fall von „by reference“ oder „by value“ wirklich. Der Wert, den Sie an die Add-Methode übergeben in kopiert. Doch für Referenztypen, die Wert ist ein Hinweis auf ein Objekt -. Und wenn Sie das Objekt über andere Verweise auf sie manipulieren, werden Sie in der Lage sein, diese Änderungen zu sehen, aber Sie auf das Objekt erhalten

Wenn Sie jemals unabhängige Kopien der Daten sehen selbst, dass Sie mit einem Werttyp legt nahe ... aber wenn Sie machen Änderungen , die vorschlägt, Sie verwenden ein wandelbar Werttyp, der eine schlechte Idee ist. Werttypen sollten fast immer unveränderlich sein, sonst führt es zu viel Verwirrung. (Referenz-Typen können auch unveränderlich sein -. String ist ein gutes Beispiel)

Weitere Informationen über die Referenztypen und Werttypen finden Sie in meinem Artikel über Referenzen und Parameter . Sie sind aus einer C # Perspektive geschrieben, aber die Grundlagen gelten auch für VB.

Ich denke, sobald Sie den Unterschied zwischen einem Werttyp Wert und einer Referenz versteht, werden Sammlungen mehr Sinn machen.

Andere Tipps

Sie können diese Regel verwenden: Wenn Sie null in Objekt zuordnen können, dann wird es als Referenz übergeben werden. Sonst wird es von Wert übergeben werden.

Ausnahme von dieser Regel sind Nullable-Typen und Strukturen. Sie werden immer als Wert übergeben.

Ich denke, es ist von der Art des Elements abhängt. Nicht auf Sammlungen.

Z. B:.

int [] ints = new int [10];

Ints [0] = 1; // -)

In diesem Fall wird 1 so lange kopiert werden, wie es ist Valuetype.

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