Skocz do zawartości
mystery

[c#] Interesująca Rzecz

Rekomendowane odpowiedzi

Witam.

 

Piszę sobie aplikację w C#.NET, w Visual Studio 2010, .netFramework 4.0.

 

Mam sobie metodę:

public void RecalculateVectorPosition()		{			double div = docs.Count;			ClearVectorValues();			foreach (Data.Document doc in docs)			{				//this is a little crazy way to ommit Hashtable bug! I spent hours to make this works...				object[] keys = new object[doc.DocumentWeightsVector.Keys.Count];				doc.DocumentWeightsVector.Keys.CopyTo(keys, 0); //no real refences to docs objects				foreach (object o in keys)				{					if (vector.ContainsKey(o))					{						double docv = (double)doc.DocumentWeightsVector[o] / div;						double v = (double)vector[o];						vector[o] = (docv + v);					}					else					{						double docv = (double)doc.DocumentWeightsVector[o] / div;						vector.Add(o, docv);					}				}							}

w niej wywołuję metodę ClearVectorValues, która wygląda tak:

private void ClearVectorValues()		{			object[] keys = new object[Vector.Keys.Count];			Vector.Keys.CopyTo(keys, 0);			foreach (object o in keys)			{				Vector[o] = 0.0;			}		}

I teraz tak. Obiekt docs jest to HashSet<Document> (dokument to klasa, którą napisałem). Document zawiera między innymi obiekt typu Hashtable, który pełni rolę jakiegoś tam wektora. Obiekt Vector, również jest typu Hashtable, do ktorego wcześniej zostały skopiowane wartości z jednego z obiektów typu Document.DocumentWeightsVector.

 

Dla mnie to jakaś magia, bo kiedy wywołuję metodę ClearVectorValues(), to oprócz wyzerowania wartości tego wektora, zeruje również wartość wektora jednego z dokumentów z HashSet.

 

Nie kumam dlaczego tak się dzieje.

Może to ktoś wyjaśnić i ew. napisać jak to obejść?

 

pozdrawiam

m

 

[edit]

chyba wiem o co chodzi już. C# chce być bardzo sprytny i kiedy wykonuje się coś takiego jak Hashtable x = y;, gdzie y jest też Hashtable to on nie kopiuje zawartości, tylko kopiuje referencję do obiektu. Zapewne ma to na celu oszczędzanie pamięci, itp. W sumie fajnie, ale czasem przydałoby się, żeby wzorem C++ obiekt był kopiowany. W C# samemu trzeba się zatroszczyć o to, co wiąże się z większą ilością kodu. Nie wydaje mi się, żeby były jakieś mechanizmy wbudowane w C# pozwalające skopiować dany obiekt. Co prawda istnieje metoda CopyTo, ale w ten sposób można kopiować tylko jednowymiarowe tablice. Niestety metoda Clone wcale nie kopiuje obiektu. Jest to tzw. shadow copy, który polega tylko na przypisaniu referencji do danego obiektu. O tzw. depth copy trzeba sie zatroszczyć samemu.

Edytowane przez mystery

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...