Avatar billede montago Praktikant
28. november 2006 - 11:26 Der er 5 kommentarer og
1 løsning

Generics / get-set problem

class DataValue
    {
        object data;

        public DataValue(string name, object data)
        {
            this.data = data;
        }
        public object Data{
            get { return (data); }
            set {
                Console.Writeline("DV.set")
                data = value; }
        }
    }
    class DataRow
    {
        ArrayList row;

        public DataRow()
        {
            row = new ArrayList();
        }
        public void Load()
        {
            /* load code here */
            row.Add(new DataValue(5551212));
            row.Add(new DataValue("Fred"));
            row.Add(new DataValue(2355.23m));
        }
        public DataValue this[int column]
        {
            get { return ((DataValue)row[column - 1]); }
            set {
                Console.Writeline("DR.Set")
                row[column - 1] = value; }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            DataRow row = new DataRow();
            row.Load();
            Console.WriteLine("Column 2: {0}", row[1].Data);
            row[1].Data = 12;    // set the ID
        }
    }


Dette program skulle gerne skrive:
/////////////
Column 2: 5551212
DR.set
Tryk på en vilkårlig tast for at fortsætte . . .
/////////////

men skriver i stedet :

/////////////
Column 2: 5551212
DV.set
Tryk på en vilkårlig tast for at fortsætte . . .
/////////////


dvs min DataRow.set bliver sprunget over ???
nogen som kan forklare dette fenomen ?
Avatar billede mikkel_sommer Nybegynder
28. november 2006 - 11:43 #1
Hvad får du hvis du prøver med prøver med:

    DataValue dv = (DataValue)row[1];
    dv.Data = 12;

????
Avatar billede montago Praktikant
28. november 2006 - 12:05 #2
stadig en "DV.set" i console...

Mit egentlige problem var, at jeg gerne ville vide hvilke DataValues som er blevet ændret til senere update i databasen.

Jeg tænkte at man kunne opdatere en liste, i DataRow.Set , uden held

jeg har løst problemet ved at:

1. indsætte en bool i DataValue kaldet "changed", for derefter at iterere igennem dem alle (ikke optimalt)

2. indsætte en liste i DataValue: "public static ArrayList updList = new ArrayList();" som jeg i SET funktionen - jeg tlføjer kun elementer hvis (indexOf < 0) (optimalt)
Avatar billede montago Praktikant
28. november 2006 - 12:08 #3
vil dog stadig vide hvorfor DataRow.set springes over
Avatar billede rasmuskl Nybegynder
28. november 2006 - 12:09 #4
Jeg ville måske forslå at bruge en Dictionary (Hashtable) i stedet for en ArrayList, da denne har lookup time (din indexOf() i ArrayList) på O(log N) fremfor ArrayLists linære O(N) ... :-) I små tilfælde betyder det dog ikke det store, men hvis du får mange updates er det en nem ændring i hvert fald :-)
Avatar billede rasmuskl Nybegynder
28. november 2006 - 12:14 #5
DataRow.set bliver ikke sprunget over.

row[1].Data = 12;    // set the ID

Denne linie sætter Data i DataValue, som rigtigt nok giver dig "DV.set". Det eneste der bliver brugt fra

      public DataValue this[int column]
        {
            get { return ((DataValue)row[column - 1]); }
            set {
                Console.Writeline("DR.Set")
                row[column - 1] = value; }
        }

Er get metoden. Hvilket du også vil se hvis du sætter en debug ind der. Hvis du ville have skrevet DR.set ud, skal du lave noget som:

row[1] = new DataValue();

i dit program.
Avatar billede montago Praktikant
28. november 2006 - 13:55 #6
doh
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB