Laden...

Referenz statt Kopie [==> deshalb heißt es ja auch *Referenz*typ]

Erstellt von theYoRecords vor 11 Jahren Letzter Beitrag vor 11 Jahren 777 Views
Thema geschlossen
T
theYoRecords Themenstarter:in
73 Beiträge seit 2012
vor 11 Jahren
Referenz statt Kopie [==> deshalb heißt es ja auch *Referenz*typ]

Hallo!

So etwas habe ich noch nie erlebt..
Hier ein kurzes Beispiel:

// Hier ist ein Objekt mit einer Eigenschaft 'List<int> Zahlen', die die Zahlen 1,2 und 3 beinhaltet.
Objekt1 o1 = dasObjekt;

// Diese Eigenschaft wird jetzt in die Variable 'zahlen' kopiert
List<int> zahlen = o1.Zahlen;
// Und der wird die 4 hinzugefügt
zahlen.Add(4);

Komischerweise beinhaltet o1.Zahlen aber jetzt auch auf einmal die 4. Ich kann mir das beim besten Willen nicht erklären.
Wenn ich mir vor und nach dem hinzufügen die Werte von o1.Zahlen ausgebe kann ich das genau beobachten.
Wie kann das sein? Hat jemand so etwas schon einmal erlebt?

Vielen Dank im Voraus!

Edit:
Und wenn ich o1 vorher noch in eine Variable kopiere, ändert sich beim Hinzufügen sogar die..

1.552 Beiträge seit 2010
vor 11 Jahren

Hallo theYoRecords,

Hat jemand so etwas schon einmal erlebt?

Ja, denn das ist genau so wie es sein soll. In .NET, sowie auch in anderen Sprachen, wenden nur Wertetypen kopiert, und nicht Referenztypen, diese werden nur referenziert.

o1.Zahlen aber jetzt auch auf einmal die 4

Nicht auch sondern nur.
Jedoch setzen wir solche Grundlagen hier im Forum voraus.

Gruß,
Michael

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

2.207 Beiträge seit 2011
vor 11 Jahren

Hallo theYoRecords,

das ist normal. Das ist die gleiche Liste. Du machst ja nirgends ein "new List ..." 😉

Gruss

Coffeebean

T
theYoRecords Themenstarter:in
73 Beiträge seit 2012
vor 11 Jahren

? Das gibt es doch nicht.. Wieso ist mir das bis jetzt noch nie aufgefallen? Ich programmiere jetzt schon ziemlich lange mit C# aber das ist das erste mal, dass ich dieses Problem habe.

Danke für eure Antworten! Dann schäm ich mich mal schnell in Grund und Boden.

1.552 Beiträge seit 2010
vor 11 Jahren

Man sieht es auch schön an folgendem Beispiel:


[Test]
public void Test_Collection()
{
    var initialList = Enumerable.Range(1, 10);
    var newList = new List<int>(initialList);
    var referenceList = initialList;

    newList.Add(11);

    CollectionAssert.AreNotEquivalent(initialList,newList);
    CollectionAssert.AreEquivalent(initialList,referenceList);
}

bzw:


[Test]
public void Test_T1()
{
    T1 t1 = new T1() {InternalList = Enumerable.Range(1, 10).ToList()};
    T1 t2 = t1;

    t2.InternalList.Add(11);

    CollectionAssert.Contains(t1.InternalList,11);
    CollectionAssert.Contains(t2.InternalList,11);
}

public class T1
{
    public List<int> InternalList { get; set; }
}


Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

Hinweis von herbivore vor 11 Jahren

Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 1.1.1 und 1.1. Der Begriff Referenztyp hätte dir schon irgendwo über den Weg laufen müssen.

Thema geschlossen