Gå til innhold

C#: Kopiere ein variabel utan å referere :S


Anbefalte innlegg

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å? :hmm:

Lenke til kommentar
Videoannonse
Annonse

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 :D

Lenke til kommentar

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 :hmm:

 

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 :blush:

Lenke til kommentar

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

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 av wolf5
Lenke til kommentar

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
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

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

Tror det er slik du mener :thumbup:

 

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 :p )

Endret av nOne
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...