Instanzen in Listen als Ref oder Copy schreiben

FJK

Erfahrenes Mitglied
Hallo,

ich habe ein merkwürdiges Problem in C#, ich nutze VS 10 RC. Win 7.

Ich habe eine Klasse A

Code:
class A
{
public int ab;

 public A(int a)
{
 ab = a;
}
}


und ich habe zwei Klassen in denen ich eine Liste habe.
Code:
class Liste1
{
public List<A> ErsteListe= new List<A>();

 public Liste()
{
}
}


class Liste2
{
public List<A> ZweiteListe= new List<A>();

 public Liste()
{
}
}

Wenn ich jetzt die ErsteListe mit Instanzen von A fülle, wie bekomme ich dann:
1. eine Copy einer bestimmten Instanz aus der ErstenListe in die ZweiteListe?
2. eine Referenz von einer bestimmten Instanz aus der ErstenListe in die ZweiteListe?

Mit:
Code:
Liste2.ZweiteListe.Add(Liste1.ErsteListe[3]);
bekomme ich meistens anscheinend eine Referenz.

Mit:
Code:
A ATemp = new A(Liste1.ErsteListe[3].ab);
Liste2.ZweiteListe.Add(ATemp);
Merkwürdiger weise bekomme ich auch hier eine Referenz :D
Ich verstehe leider nicht warum?

Können mir hier die Schlüsselwörter ByRef und ByVal weiterhelfen?
Mit Zeigern wäre das ganze so schön einfach :D
 
Zuletzt bearbeitet:
Hi

In .NET werden Reference Types (alle Klassen) als Referenz übergeben (daher auch der Name).

Wenn du eine Kopie deiner Objekte haben willst, solltest die Klasse IClonable implementieren. Mit der Methode Clone kannst du dann, wie der Name sagt, einen Klon anlegen.
 
ok, wird ich nachher mal probieren,
Was ist wenn ich eine Instanz in der Liste lösche, wie lösche ich diese dann auch im Speicher?
Gibt es noch Destruktoren?

Und was passiert wenn ich die Instanz im Speicher Lösche mit den Listeneintrag, ist der dann NULL?
 
Zuletzt bearbeitet:
ok, wird ich nachher mal probieren,
Was ist wenn ich eine Instanz in der Liste lösche, wie lösche ich diese dann auch im Speicher?
Wenn du die Instanz in der Liste "löschst" (List.Remove), entfernst du nur das Objekt aus der Liste (die Referenz wird gelöscht).Wenn es noch weitere Referenzen auf das Objekt gibt, ist es auch noch verfügbar. Sind keine Referenzen mehr vorhanden wird der Speicherbereich vom Garbage Collector freigegeben
Gibt es noch Destruktoren?
Wenn du einen für deine Klasse schreibst, gibt es einen ;-)
Mehr zum Thema findest du unter http://www.c-sharpcorner.com/Upload...1192005021208AM/UnderstandingDestructors.aspx
Und was passiert wenn ich die Instanz im Speicher Lösche mit den Listeneintrag, ist der dann NULL?
Man kommt in .NET nur mit vielen schmutzigen Tricks an die direkten Objekte im Speicher. Du arbeitest immer auf einer Referenz! Soll heißen, dein Szenario ist in .NET nicht möglich. Die Runtime verhindert es.
 
Zurück