[C#] parameters doorgeven mbv referentie

Pagina: 1
Acties:

  • zoepercavia
  • Registratie: September 2001
  • Laatst online: 26-12-2025
Korte probleem omschrijving: hoe zorg ik dat een parameter doorgegeven aan een methode altijd de laatste waarde bevat (dwz hoe zorg ik dat ik de referentie doorgeef en niet de waarde)?

Een stukje code:
C#:
1
2
3
4
5
6
7
8
9
10
11
private void Save() 
    {
        Failure failure = new Failure(
                ProjectCollection.FetchById(464),
                DepartmentCollection.FetchById(Input.ToInt("place", true)),
                Input.ToString("omschrijving", true)
        );
        
        Redirect = new Redirect("edit", "failure");
        Redirect.AddParameter("id", failure.Id);
    }


Het concrete probleem: De code speelt zich af in een webapplicatie: bovenstaande methode Save wordt aangeroepen door mijn GUI. De methode verzamelt informatie om een nieuwe Failure te maken (gewoon een domein object, verder niks bijzonders). Daarna wordt aangegeven waar de pagina naar moet redirecten en er worden enkele parameters doorgegeven om een url te bouwen(het Id van de nieuwe failure). Intern worden dan eerst alle nieuwe domein objecten opgeslagen (commit) in de database en daarna geredirect. Nu het probleem (eindelijk :)): op moment van aanroepen van AddParameter heeft Failure.Id nog een tijdelijke waarde (-1), maar de redirect heeft de waarde nodig van na de commit. Hoe zorg ik er voor dat mijn Redirect object altijd de laatste (juiste) waarde heeft?

Waar ik tot nu toe aan gedacht heb:
- op een of andere manier Failure.Id als reference meegeven zodat ie altijd de juiste waarde heeft, maar dit lukt me niet in C# (ref/out is iig niet de goede oplossing).
- eerst committen en daarna pas het Redirect object aanmaken. Dit werkt natuurlijk prima, maar dan moet de programmeur zelf bedenken wanneer hij gaat committen en dat heb ik liever niet.

Mijn vraag is dus: is het mogelijk referenties naar properties van objecten mee te geven aan een methode?

Ter extra informatie, dit staat in de documentatie:
A property is not a variable and cannot be passed as a ref/out parameter.
:(

[ Voor 6% gewijzigd door zoepercavia op 11-06-2003 15:03 ]

Panacea.NL als je geinteresserd bent in IT en Geneeskunde!


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Ik heb geen verstand van C#, maar wel complimenten voor je openingspost, daar kunnen sommig mensen nog wat van leren :)

[ Voor 3% gewijzigd door curry684 op 11-06-2003 15:04 ]

Professionele website nodig?


  • whoami
  • Registratie: December 2000
  • Laatst online: 01:57
Kan je niet het gehele object als parameter meegeven ofzo?

https://fgheysels.github.io/


  • zoepercavia
  • Registratie: September 2001
  • Laatst online: 26-12-2025
whoami schreef op 11 June 2003 @ 15:20:
Kan je niet het gehele object als parameter meegeven ofzo?
Jawel, alleen het verschilt nog al per keer wat ik van dat object wil weten. Meestal zal ik inderdaad het Id willen weten om te redirecten naar de volgende pagina, maar stel dat het iets ander is, dan zou ik dat allemaal expliciet moeten coden en dat vind ik niet echt netjes.
Nog een andere oplossing die ik net bedacht is om zowel het object mee te geven en een string die de naam van het veld voorstelt en dan dmv reflectie de waarde op te halen. Alleen vind ik dat nogal gekunsteld en niet duidelijk voor de programmeur die met het framework werkt.
Het vage is het dat het er op lijkt dat je in VB.net wel properties door kan geven met ref/out, dus ik vroeg me af of er een constructie is om dat in C# te doen.

Overigens betekent het feit dat ik zo moet klooien misschien wel dat dit gedeelte van m'n framework gewoon flawed is en dat ik gewoon iets radicaals anders moet verzinnen, maar ik dacht als het kan dan kan het.

[off-topic]Bedankt curry :) Ik lees al een tijdje op dit forum en wordt een beetje moe van mensen die 100 regels code posten en zeggen "Dit werkt niet! Waarom niet?" zonder foutmeldingen etc.. te posten, helpen ze zichzelf ook niet echt mee en wekt alleen maar irritatie op.[/off-topic]

Panacea.NL als je geinteresserd bent in IT en Geneeskunde!


  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
Het is een beetje slordig, maar kun je niet zoiets doen:
C#:
1
2
3
4
5
6
7
public int Id {
    get {
        if (m_id == NOT_INSERTED_ID) 
            // zorg ervoor dat ie de goede waarde krijgt.
        return m_id;
    }
}

  • zoepercavia
  • Registratie: September 2001
  • Laatst online: 26-12-2025
Marcusk bedankt voor het idee, alleen het ervoor zorgen dat ie de goede waarde krijgt gebeurt helemaal op het eind, namelijk tijdens het opslaan in de db. Dan is het redirect object allang aangemaakt en zit je dus met de verkeerde waarde (NOT_INSERTED_ID idd).
Nog iets waar ik aan gedacht had is om al bij het maken van nieuwe objecten dmv de constructor ze vast een Id geven. Echter gebruik ik nu het Id om te kunnen zien of een object nieuw is of niet (nieuw = -1, al het andere bestaand) en zou ik dat dus op een andere manier moeten aangeven.

Maar misschien kan iemand me antwoord geven wat de beste plek is om objecten een Id te geven. Tijdens het aanmaken of tijdens het opslaan?

Panacea.NL als je geinteresserd bent in IT en Geneeskunde!


  • whoami
  • Registratie: December 2000
  • Laatst online: 01:57
Volgens mij tijdens het opslaan.
Dan pas kan je eigenlijk weten welk id een record moet krijgen.

Als jij 4 objecten aanmaakt, en deze al een id geeft zonder dat ze opgeslagen worden, en iemand anders maakt terzelfder tijd ook een aantal objecten aan die in de DB moeten gesaved worden, dan kan je er bijna zeker van zijn dat je in de problemen gaat komen met je Id's.

https://fgheysels.github.io/


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
mischien is het op te lossen door gebruik van een delegate ofzo? dus inplaats van een property een delegate getID(). Deze returnt dan gewoon het property ID. Oke het is niet zo netjes omdat je weer allemaal delegates enzo moet maken maar je probleem is wel opgelost

“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.”


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Wanneer vindt die save van die nieuwe Failure plaats? Want die staat er niet. Je moet het zo bouwen dat je expliciet die nieuwe entity instance savet, zodat je de identity info teruggelezen krijgt in je entity object zodat je die value meteen kunt gebruiken.

Failure newFailure = //.. creer nieuwe failure
newFailure.Save();

_redirect = new Redirect(//...);
_redirect.AddParameter("id", Failure.Id);

Failure.Id heeft na de save een waarde, OF een exception heeft plaatsgevonden dat de save niet is gelukt.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • zoepercavia
  • Registratie: September 2001
  • Laatst online: 26-12-2025
Die Save vindt plaats door een Unit of Work op het einde van alles. Althans dat was de bedoeling ik heb het toch maar even opgelost door een tussentijdse Commit te doen. Er zijn wel andere mogelijkheden maar die zijn niet intuitief, aan allerlei gekunstelde constructie heb ik toch niks (Keep It Simple :))

Panacea.NL als je geinteresserd bent in IT en Geneeskunde!

Pagina: 1