Toon posts:

[C#/ASP] Struct object in arraylist, hoe direct veranderen?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Heeyy,

Kzat te klooien met ASP (C#..) webservice en al..

Wat ik wil is een webservice die gewoon netjes een array met (in dit geval) windows output, met de volgende info:

- Title
- Body
- ID

Misschien nog meer, maar ff niet relevant..

Dus heb ik deze struct aangemaakt:
C#:
1
2
3
4
5
6
7
 public struct Window
    {
        public string Title;
        public string Body;
        public string Type;
        public string Id;
    }


Daarna deze functie:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[WebMethod]
        public Window[] Init()
        {

            ArrayList WindowList = new ArrayList();
            Window InitWindow = new Window(); 
                       
            InitWindow.Title = "Test1";
            WindowList.Add(InitWindow);
            InitWindow.Title = "Test2";
            WindowList.Add(InitWindow);
            WindowList.Add(InitWindow);

            ((Window)WindowList[1]).Title = "Test3"; //Line waar het om gaat <-----
            
            Window[] ReturnWindow = new Window[WindowList.Count];
            for (int i = 0; i < WindowList.Count; i++)
            {
                ReturnWindow[i] = (Window)WindowList[i];
            }

            return ReturnWindow;            
        }


Als ik de line waar het om gaat weghaal, krijg ik netjes een output:

<ArrayOfWindow>

<Window>
<Title>Test1</Title>
</Window>

<Window>
<Title>Test2</Title>
</Window>

<Window>
<Title>Test2</Title>
</Window>
</ArrayOfWindow>

Maar nu wil ik dus de variabele Title veranderen IN de array, met die regel code.. Maar ik krijg de volgende error:

CS0445: Cannot modify the result of an unboxing conversion

Opgezocht op google, kwam hier op uit:

http://msdn2.microsoft.com/en-us/library/1zd0a13x.aspx

Probleem is.. ksnap er niet veel van wat daar staat.. Wat moet ik nu precies doen om dit op te lossen? Of heeft iemand een ander (beter) idee..

Het was namelijk de bedoeling om een array aan te maken, zonder vooraf een grote in te stellen... Dit omdat je anders een gigantisch grote lijst krijgt, met lege dingen erin... Heb veel dingen geprobeert, maar om 1 of andere reden moet je dus altijd een vooraf bepaalde grootte invullen bij een normale [] array.. zie ik iets over het hoofd? Of kan dit echt niet? En als dit niet kan.. is het dan de beste manier zoals ik het doe om dit op te lossen of heeft iemand iets anders?

Hmm.. wazig verhaal volges mij.. :+ Hoop dat iemand kan helpen _/-\o_

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

mulder

ik spuug op het trottoir

Volgens mij staat er dat je dit moet doen:
Window window = ((Window)WindowList[1]);
window.Title = "Boe";
;)

oogjes open, snaveltjes dicht


Verwijderd

Topicstarter
Don Facundo schreef op dinsdag 21 februari 2006 @ 20:16:
Volgens mij staat er dat je dit moet doen:
Window window = ((Window)WindowList[1]);
window.Title = "Boe";
;)
Maar dan maak je een nieuwe aan, een kopie, geen pointer of iets in die trend en verander je dus niet de arraylist zelf.. tog?

EDIT: SNel geprobeerd.. en ja.. veranderd dus nix aan de array..

[ Voor 11% gewijzigd door Verwijderd op 21-02-2006 20:26 ]


  • __fred__
  • Registratie: November 2001
  • Laatst online: 04-04 08:56
Volgens mij zijn structs in C# value types en geen reference types. Er wordt dus impliciet een kopie gemaakt bij het stoppen ervan in een arraylist. De compiler geeft alleen maar aan dat de code die je dus schrijft idd vrij zinloos is.
Dus een class van maken, dat is een reference type. Het omzetten van een value in een reference type en andersom gebeurt in managed code ALTIJD door een kopie te maken. (dit heet boxing/unboxing).

http://msdn.microsoft.com...vclrfboxingunboxingpg.asp

  • whoami
  • Registratie: December 2000
  • Laatst online: 07-04 22:26
structs zijn idd value types, en moeten dus iedere keer geboxt worden als je ze op de arraylist zet, en ge-unboxed als je ze er vanaf haalt, en cast naar dat type struct. Dat komt omdat een ArrayList objecten op die arraylist zet. Daar kan je dus met een performantie-probleem zitten.

Een class van je struct maken, zou idd zowiezo de beste oplossing zijn.
Indien je dit niet wilt, en toch bij een struct wilt blijven, dan denk ik dat jet het zo zal moeten oplossen:
code:
1
2
3
Window w = (Window)windowList[1];
w.Title = "melp";
windowList[1] = w;

https://fgheysels.github.io/


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Idd doordat het een ValueType is wordt hij altijd als value gepast. Dus wat je zult moeten doen is
C#:
1
2
3
Window window = (Window)WindowList[ 1 ];
window.Title = "Blaat";
WindowList[ 1 ] = window;

Het opvragen van een element met de blokhaken gebeurt door middel van een indexer, dit is eigenlijk gewoon een method en die returnt in het geval van een ValueType gewoon een kopie van de value die er in staat. Daar een wijziging op aanbrengen is dus idd vrij nutteloos en de enige oplossing is een kopie opvragen, die wijzigen en dan die waarde opnieuw in je Lijst kopieren.
edit:

wat whoami zegt dus ;)

[ Voor 5% gewijzigd door Woy op 21-02-2006 21:01 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
Heey,

Thanks voor alle reacties :) _/-\o_

Kdenk dat ik het ga probere dan met classes, kweet iig nu al weer iets meer over hoe C# denk :P

Zeg, ik taai hem af :O we gaan morge weer verder :z

Thanks!

Verwijderd

Topicstarter
Heeyy,

Okay, het is gelukt,

Waar je wel op moet letten is als je een nieuwe toevoegd in de array, je er eerst nieuw geheugen voor vrijmaakt, dus zo:

C#:
1
2
3
4
5
6
7
8
9
Window InitWindow;
            
InitWindow = new Window();
WindowList.Add(InitWindow);
InitWindow = new Window();
WindowList.Add(InitWindow);

//En dan
((Window)WindowList[1]).Title = "Test3"; // WERKT !! :)


Thanks!

[ Voor 8% gewijzigd door Verwijderd op 23-02-2006 13:40 ]

Pagina: 1