problem z przypisaniem wartosci do List<klasa>

0

mam problem z przypisaniem wartosci

 List<Klasa> PopLista = new List<Klasa>();
for()
{
Klasa K=new Klasa(a,b);
PopLista.add(K);

}
class Klasa
{
public char[] aa;
public int bb;
public Klasa(char []a,int b){aa=a,bb=b}
}

i tu sie pojawia problem
do listy dodaje sie nowy element ale wartosc zamiast przypisywac sie tylko do ostatniego elementu przypisuje sie do wszystkich i na koniec petli mam liste takich samych elementow o wartosci ostatniego dodanego elementu do listy. ktos wie dlaczego?
zeby bylo smieszniej tylko wartosc a sie zapisuje wszedzie tak samo b jest inne

0

Tablice w C# są przekazywane przez referencję.

1

Dodaj sobie (to nie jest konieczne, ale tek wypada) implementacje interfejsu ICloneable i (to jest właściwe rozwiązanie) metodę Clone() klonującą twój obiekt (zwracającą płytką kopię).

0

Dodaj sobie (to nie jest konieczne, ale tek wypada) implementacje interfejsu ICloneable

Jako ciekawostkę dodam, że autorzy .NET nie zalecają już w ogóle implementacji ICloneable - gdyby nie kompatybilność wsteczna już dawno interfejs ten byłby [Obsolete]

0

no i co? jesli nie clone to musze takiego kondona uzywac?

List<Klasa> PopLista = new List<Klasa>();
for()
{
Klasa K=new Klasa(a,b);
PopLista.add(K);

}
class Klasa
{
public char[] aa;
public int bb;
public Klasa(char []a,int b)
{

aa=new char [a.Length];
          for (int i = 0; i < a.Length; i++)
          {
              aa[i] = a[i];
          }
bb=b}
}
1

do klasy:

public Klasa Clone()
{
    return this.MemberwiseClone();
}

do programu:
PopLista.add(K.Clone());

do detiego ;):

Jako ciekawostkę dodam, że autorzy .NET nie zalecają już w ogóle implementacji ICloneable - gdyby nie kompatybilność wsteczna już dawno interfejs ten byłby [Obsolete]

Nie słyszałem nic o tym... A co jest proponowane jako zamiennik? Ew. jak inaczej rozwiązywać zagadnienie przekazania do metody funkcji umożliwiającej "klonowanie się"?

@ozi88 - dzięki!

0

Tutaj trochę informacji na temat tego problemu:
http://blogs.msdn.com/brada/archive/2003/04/09/49935.aspx

0
public Klasa(char []a,int b){aa=a.ToArray(),bb=b}
}

;]

0
ryh000 napisał(a)

no i co? jesli nie clone to musze takiego kondona uzywac?

Wystarczy że napiszesz

PopLista.add(new Klasa(a,b));

1 użytkowników online, w tym zalogowanych: 0, gości: 1