knuto Skrevet 25. mars 2006 Del Skrevet 25. mars 2006 Dette er eit heilt basic spørsmål, men eg forstår ikkje denne refereringa til C# Eg har ein variabel (eksempelvariabel), og vil ha ein til av denne (les: duplisera). Eg kan ikkje berre gjera slik: string kopi_av_eksempelvariabel = eksempelvariabel; fordi då vil kopi_av_eksempelvariabel berre referere eksempelvariabel etter som eg forstår. Men korleis i huleste kan eg duplisera ein variabel då? Lenke til kommentar
oskaremil Skrevet 25. mars 2006 Del Skrevet 25. mars 2006 string eksempel = "Jesus"; string kopi = eksempel; eksempel = "Konduktør"; nå vil fortsatt kopi være "Jesus". og da er det jo et duplikat. hva er det egentlig du prøver å gjøre ? Hvis du plagast med at kopien forandrer seg etter originalen er det fordi du har bedt den om å forandre seg et sted i koden Lenke til kommentar
knuto Skrevet 25. mars 2006 Forfatter Del Skrevet 25. mars 2006 Heh. Jau, jau. Av ein eller annan grunn fungerer ikkje visse ting som dei skal, men får løyse problema på andre måter Lenke til kommentar
oskaremil Skrevet 25. mars 2006 Del Skrevet 25. mars 2006 hvis du viser meg litt kode kan jeg kanskje fortelle deg hvor feilen ligger Lenke til kommentar
Peter Skrevet 25. mars 2006 Del Skrevet 25. mars 2006 Knuto: Du må bruke Copy() eller CopyTo() metodene som ligger i string-klassen. Lenke til kommentar
knuto Skrevet 26. mars 2006 Forfatter Del Skrevet 26. mars 2006 Det er faktisk ikkje snakk om ein string i det heile tatt. Eg lagar eit glosepuggingsprogram. Dette programmet laster ein gloseprøve frå i flatfil, parsar ho, og legg orda inn i klassen word_test. word_test består eigentleg for det meste av ein normal såkalla stack. Ein stack som ein legg til på slutten, og fjernar frå slutten. Når brukaren har køyrt gjennom prøven er med andre ord stack'en tom. Det er då eg kunne tenkt meg å ha ein "kopi" av word_test slik at brukaren kunne ta testen ein gong til utan å måtte laste fila på nytt. Men dette vil ikkje fungera: word_test saved_test = new word_test(); saved_test = test; Viss eg seinare gjer dette: test = saved_test; Så forblir test av ein eller annan grunn like tom Kanskje heile stack-prinsippet er litt vel C++-aktikt, men som sagt er eg ein C++ programmerar. Trur eg må lese heile spesifikasjonen til C# før eg spø r om noko neste gong Lenke til kommentar
oskaremil Skrevet 26. mars 2006 Del Skrevet 26. mars 2006 ok. stack har jeg null peiling på Lenke til kommentar
Peter Skrevet 26. mars 2006 Del Skrevet 26. mars 2006 Stack betyr egentlig bare FILO. Altså "First In, Last Out". Du kan se på det som en stabel med f.eks. dvder. Når du legger til en dvd, legges den på toppen, når du fjerner en, fjernes den fra toppen. Så for å fjerne den første dvden, må du fjerne alle de andre først. Dette er også slik rekursive funksjoner fungerer. De legges i en stack oppå hverandre til funksjonene begynner å returnere (terminere) Lenke til kommentar
knuto Skrevet 26. mars 2006 Forfatter Del Skrevet 26. mars 2006 (endret) Etter litt grundigare forskining på C# ser eg at det eg seier stemmer. Ein kan ikkje kopiera ein reference type på min måte. Korleis skal ein gjera det då? *les vidare i spesifikasjonen* Edit: Her er forresten eit eksempel på ein stack, eller på godt norsk, ein stabel: http://msdn.microsoft.com/[...]/vclrfcsharpspec_1.asp Endret 26. mars 2006 av knuto Lenke til kommentar
wolf5 Skrevet 28. mars 2006 Del Skrevet 28. mars 2006 (endret) C# har ikke støtte for direkte kopiering av objekter. Selv pleier jeg å deserialisere og serialisere objekter for å få en ren kopi. Dette krever at klassene er serialiserbare ([serializable] class xyz). Mange standardklasser er serialiserbare i utgangspunktet. Du kan prøve denne metoden MinKlasse MK = (MinKlasse)DeepCopy(GammelInstansAvMinKlasse) /// <summary> /// Metode for å få en skikkelig dyp Clone kopi av et serialiserbar objekt. /// </summary> /// <param name="ObjectToCopy"></param> /// <returns></returns> public static object DeepCopy(object ObjectToCopy) { MemoryStream ms = new MemoryStream(); using(ms){ //Serialiser XmlSerializer xmlSerializer = new XmlSerializer(ObjectToCopy.GetType()); xmlSerializer.Serialize(ms, ObjectToCopy); //Deserialiser XmlSerializer xmlSerializer2 = new XmlSerializer(ObjectToCopy.GetType()); ms.Position = 0; object obj = xmlSerializer2.Deserialize(ms); return obj; } } Endret 28. mars 2006 av wolf5 Lenke til kommentar
knuto Skrevet 28. mars 2006 Forfatter Del Skrevet 28. mars 2006 Har no lest spesifikasjonen Nå har eg mykje meir peiling på C# På dei klassane eg lagar som brukaren kan koma til å villa kopiera er det visst lurast å laga ein Clone metode. Har fått skikkeleg fortgang på programmeringsprosjektet no. Har spart all tida eg brukte på lesing fordi eg slepp å eksprimentera *venne meg av å alltid leva etter: den tid, den sorg* Lenke til kommentar
Oracel Skrevet 29. mars 2006 Del Skrevet 29. mars 2006 Har no lest spesifikasjonen Nå har eg mykje meir peiling på C# På dei klassane eg lagar som brukaren kan koma til å villa kopiera er det visst lurast å laga ein Clone metode. Har fått skikkeleg fortgang på programmeringsprosjektet no. Har spart all tida eg brukte på lesing fordi eg slepp å eksprimentera *venne meg av å alltid leva etter: den tid, den sorg* 5827957[/snapback] Du er inne på det, klassene det er snakk om må implementere ICloneable. Lenke til kommentar
oyvind_b Skrevet 30. mars 2006 Del Skrevet 30. mars 2006 Jeg ville gått for IClonable, som Oracel sier. Metoden som Wolf5 beskriver fungerer til sitt bruk, men dersom det er større mengder cloning som skal gjøres taper denne stort på ytelse. Øyvind Lenke til kommentar
knuto Skrevet 1. april 2006 Forfatter Del Skrevet 1. april 2006 Implementera ICloneable? Kvifor i all verda skulle eg gjera det så avangsert? Det er vel ikkje så vanskeleg å kopiera ein klasse? Lenke til kommentar
Peter Skrevet 1. april 2006 Del Skrevet 1. april 2006 Det har med design, OOP og abstraksjon å gjøre. Jeg kan lage en funksjon som krever et IClonable interface, uten å vite noe mer om klassen, og fortsatt kopiere den. Fordi ICloneable krever(tipper jeg) metoden ICloneable::clone(), og den vet jeg er implementert, fordi klassen din implementerer ICloneable interfacet. Noen kan sikkert smelle sammen et enkelt eksempel. Lenke til kommentar
nOne Skrevet 5. april 2006 Del Skrevet 5. april 2006 (endret) Tror det er slik du mener using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace varTest { public partial class TestForm : Form { private MyText textA; private MyText textB; public TestForm() { InitializeComponent(); textA = new MyText(); textB = new MyText(); } private void btnUpdate_Click(object sender, EventArgs e) { GetData(); // textA.Text = Hei, textB.Text = Hopp textA = (MyText)textB.Clone(); // textA.Text = Hopp, textB.Text = Hopp GetData(); // textA.Text = Hei, textB.Text = Hopp /* * Garbage Col. sletter gammel textA i linje 2 * siden den ikke lenger er i graph * * henter data etter clone også for å vise at * de ikke deler adresse */ } private void GetData() { textA.Text = "hei"; textB.Text = "hopp"; } } public class MyText : ICloneable { private String text; public String Text { get { return text; } set { text = value; } } public Object Clone() { MyText target = new MyText(); target.text = this.text; return target; } } } (edit: Fiksa kommentarer litt, var litt smalerer kodefelt her en det jeg er vant til ) Endret 5. april 2006 av nOne Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå