Toon posts:

C# MemberwiseClone

Pagina: 1
Acties:
  • 148 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Op msndn las ik dat MemberwiseClone een shallow copy van een object maakt.
Dit betekend toch dat hij bij een reference type alleen de pointer kopierd en niet het object zelf. Maar waarom komt er bij de volgende code dan "dit is nummer 1" uit ?.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class test 
    {
        public test(string str)
        {
            testString = str;
        }

        public string testString= "Niks";

        public test Clone()
        {
            return (test)this.MemberwiseClone();
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            test t = new test("dit is nummer 1");
            test t2 = t.Clone();
            t2.testString = "dit is nummer 2";
            Console.WriteLine(t.testString);
            //Er komt uit : dit is nummer 1 
            Console.ReadLine();
        }
    }

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 07-04 22:27

Bosmonster

*zucht*

Als je alleen de reference wilt kopieren, had je toch gewoon t2 = t kunnen doen? Waarom zou daar dan een MemberwiseClone() method voor zijn?

Die kopieert ook het object, maar shallow in de zin dat ie van references in het object alleen de references kopieert en niet daar ook de objecten van. Valuetypes kopieert ie (uiteraard) wel mee.

Google/MSDN had je overigens exact hetzelfde kunnen vertellen.

[ Voor 46% gewijzigd door Bosmonster op 23-02-2006 17:36 ]


Verwijderd

Topicstarter
ik had verwacht met MemberwiseClone hetzelfde zou doen als t2 = t;

wat is het verschil tussen mijn code en deze code ? http://members.home.nl/clermond/code.jpg

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 07-04 22:27

Bosmonster

*zucht*

Ik zie jou geen interface ICloneable implementeren.

Wat sowieso nogal vreemd is. ICloneable heeft alleen een Clone member, die je kunt gebruiken als MemberwiseClone() niet volstaat. Hem invullen met MemberwiseClone() is dus wat nutteloos, tenzij die andere functies heeft die een ICloneable implementatie verwachten.

[ Voor 146% gewijzigd door Bosmonster op 23-02-2006 17:55 ]


  • Shezzie
  • Registratie: Januari 2005
  • Laatst online: 19-03 14:02

Shezzie

Lekker hoor!

Check CodeProject ff als je wilt weten hoe het extact zit.

Verwijderd

Topicstarter
http://msdn.microsoft.com...smemberwiseclonetopic.asp

op die link is het volgende te lezen.

If the field is a reference type, the reference is copied but the referred object is not; therefore, the reference in the original object and the reference in the clone point to the same object

dus dan zou de uitkomst van mijn code toch anders moeten zijn ?

  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 25-09-2023
nee, want je verandert de string "dit is nummer 1" niet door de toekenning van "dit is nummer 2". Op de plaats waar "dit is nummer 2" staat, staat eigenlijk een pointer naar de string "dit is nummer 2". Vervolgens pas je de kopie van de pointer aan: de oorsponkelijke pointer blijft daardoor onveranderd, en de string waarnaar die point was ook niet veranderd. Ofwel, de uitkomst is precies zoals je zou verwachten :)

Of beter gezegt: Een assignment a = b laat a naderhand naar hetzelfde object verwijzen als waar b op dat moment naar verwijst, tenzij:

• a of b een struct is
• a of b een primitief type is (int, char, bool)

(er zijn talen waarbij alles een object is, dan heb je deze uitzonderingen niet en ben je dus altijd met pointers bezig).

[ Voor 33% gewijzigd door Infinitive op 23-02-2006 19:01 ]

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


Verwijderd

Topicstarter
Maar wat doen ze op dat plaatje dan anders ?

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 23:22

mulder

ik spuug op het trottoir

Ze tonen op dat plaatje aan dat de GetHashCode voor die objecten een gelijk resultaat zal geven.

oogjes open, snaveltjes dicht


Verwijderd

Topicstarter
ja maar op dat plaatje verwijzen bijde pointers naar hetzelfde object en bij mij niet ?.... :?

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 23:22

mulder

ik spuug op het trottoir

Verwijderd schreef op vrijdag 24 februari 2006 @ 01:29:
ja maar op dat plaatje verwijzen bijde pointers naar hetzelfde object en bij mij niet ?.... :?
Waar maak je dat uit op, want volgens mij juist niet? Ze tonen aan de 2 verschillende objecten met dezelfde inhoud ook dezelfde hash hebben. De nummers die er staan zijn imho database id's voor het object.

oogjes open, snaveltjes dicht


  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

een tekeningetje zegt meer dan 1000 woorden...
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
referentie van t ------------- t ----------- testString

bij t2 = t

referentie van t ------+------ t ----------- testString
                       |
referentie van t2 -----+

bij t2 = t.MemberWiseClone()

referentie van t ------------- t ----+------ testString
                                     |
referentie van t2 ------------ t2 ---+

na toewijzen van nieuwe testString:

referentie van t ------------- t ----------- testString

referentie van t2 ------------ t2 ---------- nieuwe testString

ASSUME makes an ASS out of U and ME


Verwijderd

Topicstarter
Bedankt :)
Pagina: 1