[c#] references

Pagina: 1
Acties:

  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 16-09 20:30
Ik heb een object die wat lokale data bevat (een struct en een arraylist). Ik wil een from maken die een reference naar deze twee objecten krijgt en de waarde hiervan laat zien. De reference is nodig omdat de data constant verandert, data oversturen zo onzinning zijn.

De variablen in de hoofdclasse
C#:
1
2
private JobToExecute job;
private ArrayList results;


de constructor van het formulier:
C#:
1
2
3
4
5
6
7
8
9
10
private ArrayList resultsForm;
private JobToExecute jobForm;

public FormShow(ref ArrayList r, ref JobToExecute j)
        {
            InitializeComponent();
            
            resultsForm=r;
            jobForm=j;
        }


en wordt zo ' geconstrueerd' vanuit de hoofdclasse
C#:
1
2
3
FormShow temp=new FormShow(ref results, ref job);

temp.Show();


als ik de waarde van job en/of results in de hoofdclasse verandert, veranderen deze (jobForm & resultForm) niet mee in mijn formulier, terwijl ik ze toch als reference meestuur. Wat gaat hier mis, of zie ik iets anders over het hoofd?

if broken it is, fix it you should


  • evolnick
  • Registratie: Januari 2006
  • Laatst online: 04-06-2024
je hoeft hier geen ref te gebruiken lijkt mij.
Als je een variabele meegeeft als ref en je veranderd de data binnen de aangeroepen functie, dan is die data ook in de hoofdclasse aangepast, niet andersom.
Ik heb de ref nog nooit gebruikt, maar dit is wat ik zo lees op internet (bv http://msdn2.microsoft.com/en-us/vcsharp/aa336814.aspx)

Je zou een andere oplossing kunnen proberen trouwens:
De hoofdclasse meegeven aan FormShow ( d.m.v new FormShow(this) ). Vanuit FormShow vraag je d.m.v. get functies in de hoofdklasse de ArrayList /JobToExecute op.

edit:
Misschien vergeet je een redraw van je FormShow wanneer de data is aangepast, zou ook een reden kunnen zijn waarom je geen verandering ziet.

[ Voor 10% gewijzigd door evolnick op 19-04-2007 10:40 ]


  • cspare
  • Registratie: Oktober 2006
  • Laatst online: 29-07 22:19

cspare

What the deuce?!

Wat je ook in de gaten moet houden, dat als je bv. textbox1.text = jobForm.name; doet, dat dan de waarde by value wordt meegegeven, en dus niet automatisch je textbox wordt upgedate als je je jobForm aanpast.
Databinding heeft dit 'probleem' niet.

The one who says it cannot be done, should never interrupt the one who is doing it.


  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 16-09 20:30
evolnick schreef op donderdag 19 april 2007 @ 10:39:
je hoeft hier geen ref te gebruiken lijkt mij.
Als je een variabele meegeeft als ref en je veranderd de data binnen de aangeroepen functie, dan is die data ook in de hoofdclasse aangepast, niet andersom.
Ik heb de ref nog nooit gebruikt, maar dit is wat ik zo lees op internet (bv http://msdn2.microsoft.com/en-us/vcsharp/aa336814.aspx)

Je zou een andere oplossing kunnen proberen trouwens:
De hoofdclasse meegeven aan FormShow ( d.m.v new FormShow(this) ). Vanuit FormShow vraag je d.m.v. get functies in de hoofdklasse de ArrayList /JobToExecute op.

edit:
Misschien vergeet je een redraw van je FormShow wanneer de data is aangepast, zou ook een reden kunnen zijn waarom je geen verandering ziet.
Get wil ik niet gebruiken ivm de grote van de arrays, data wordt wel ' gedrawt' dus dat moet ook goed gaan.

Als ik de references wel haal gebeurd en ook niets.
Als ik geen ref meegeef, de job die gestuurd wordt (in de constructor j genaamd) aanpas j.naam="blaat" is deze verandering niet in de hoofdclasse waar te nemen. Als ik wel een ref mee geef wel.

Nadat ik job=j heb gedaan en dan job.naam=" blaat" doe is de job in de hoofdclasse niet aangepast.

maw de '=' veroorzaakt de fout, deze copieerd het object ipv het geheugen adres (de reference).

(job is een struct en heeft oa een eigenschap naam).

if broken it is, fix it you should


  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 16-09 20:30
cspare schreef op donderdag 19 april 2007 @ 10:45:
Wat je ook in de gaten moet houden, dat als je bv. textbox1.text = jobForm.name; doet, dat dan de waarde by value wordt meegegeven, en dus niet automatisch je textbox wordt upgedate als je je jobForm aanpast.
Databinding heeft dit 'probleem' niet.
Ik kan toch geen databinding gaan toepassen aangezien in geen databse heb, alleen een struct en een arraylist

if broken it is, fix it you should


  • cspare
  • Registratie: Oktober 2006
  • Laatst online: 29-07 22:19

cspare

What the deuce?!

elgringo schreef op donderdag 19 april 2007 @ 10:50:
[...]
Ik kan toch geen databinding gaan toepassen aangezien in geen databse heb, alleen een struct en een arraylist
Je kan een datasource instellen in controls. Deze datasource kan elk willekeurig object zijn, dus ook objecten van zelf gemaakte classes. Je moet dan wel de ToString() methode overriden.
Ik had niet in de gaten dat je met een struct werkt, hoe dat precies daarmee zit weet ik niet.

The one who says it cannot be done, should never interrupt the one who is doing it.


  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 16-09 20:30
cspare schreef op donderdag 19 april 2007 @ 10:56:
[...]


Je kan een datasource instellen in controls. Deze datasource kan elk willekeurig object zijn, dus ook objecten van zelf gemaakte classes. Je moet dan wel de ToString() methode overriden.
Ik had niet in de gaten dat je met een struct werkt, hoe dat precies daarmee zit weet ik niet.
Als ik het goed begrijp is wat ik wil niet mogelijk?

Als ik nml mbv een reference een struct meegeeft deze verander (binnen een methode) is de verandering is het andere object waar te nemen. (zie de voorbeelden met ref).
Ik wil dus dat deze reference blijft bestaan in mijn 2de object.

met C++ stuur je een pointer mee, en dan is het klaar en werkt het. C# heeft hier geen alternatief voor?

maw:
Object 1 maakt een struct A aan. Vervolgens maakt object 1, object 2 aan. Object 2 moet nu naar hetzelfde struct a verwijzen als object 1 dat doet. Dus als object 1 struct a wijzigd moet object 2 deze kunnen waarnemen.

if broken it is, fix it you should


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 07:20

.oisyn

Moderator Devschuur®

Demotivational Speaker

elgringo schreef op donderdag 19 april 2007 @ 10:48:
Als ik de references wel haal gebeurd en ook niets.
Als ik geen ref meegeef, de job die gestuurd wordt (in de constructor j genaamd) aanpas j.naam="blaat" is deze verandering niet in de hoofdclasse waar te nemen. Als ik wel een ref mee geef wel.

Nadat ik job=j heb gedaan en dan job.naam=" blaat" doe is de job in de hoofdclasse niet aangepast.

maw de '=' veroorzaakt de fout, deze copieerd het object ipv het geheugen adres (de reference).

(job is een struct en heeft oa een eigenschap naam).
Dit is toch geheel logisch? Je j in je FormShow constructor is een referentie. De jobForm in je FormShow instance is echter geen referentie. Als je aan jobForm dus een andere JobToExecute assignt, wordt er dus een kopie gemaakt. Het is niet dat dat ineens een referentie wordt omdat je er een referentie aan hebt geassigned. jobForm is helemaal geen referentie naar een JobToExecute, het is gewoon een JobToExecute.

C# kent helaas geen syntax om een value type als reference te behandelen. Je kunt 'm boxen en unboxen (casten naar object, maar dat betekent dat je overal waar je een referentie naar een JobToExecute wilt hebben je 'm als object moet gebruiken en dus zelf moet casten, oftewel lelijk), of je moet 'm in een class gieten:
C#:
1
2
3
4
5
6
7
class JobToExecuteRef
{
    public JobToExecute job;

    public JobToExecuteRef() { }
    public JobToExecuteRef(JobToExecute j) { job = j; }
}


In de aanroepende code doe je dan een new JobToExecuteRef, en in FormShow gebruik je tevens JobToExecuteRef om de referentie op te slaan, en een JobToExecuteRef als parameter (en dus geen ref JobToExecuteRef of een ref JobToExecute).

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • DrDelete
  • Registratie: Oktober 2000
  • Laatst online: 01-12 20:46
wel een complexe constructie, probeer model en view uit elkaar te halen, tip:

Giet al je "data" als model state in 1 class en maak de data items als public properties beschikbaar.

Mocht een van je data items wijzigen raise dan een event dat er iets aan je model gewijzigd is. Het formulier laat je subscriben op de events van het model. Na het raisen van het event kun je vanuit het formulier de data van het model uitlezen.
Pagina: 1