mystery Opublikowano 13 Stycznia 2010 Zgłoś Opublikowano 13 Stycznia 2010 (edytowane) 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 13 Stycznia 2010 przez mystery Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
shooter Opublikowano 13 Stycznia 2010 Zgłoś Opublikowano 13 Stycznia 2010 Jak już to: shallow i deep copy. Przecież to jasne, że tylko referencja jest przypisana. Nie wiem skąd Ci się ubzdurała jakaś kopia. Dla kopii trzeba klonować. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...