HDSoftware Skrevet 28. august 2008 Del Skrevet 28. august 2008 Folkens... Jeg må ha fått en brainfart for jeg ser ikke hvor jeg feiler Jeg har noen tabeller der jeg skal legge til poster. I den forbindelse har jeg en metode som skal validere noen felter i tabellene som jeg kaller slik: PrepareRecord(ThisGUID, RecType, RecProp) Meningen er at metoden skal putte nødvendige verdier inn hvis de mangler. Jeg har prøvd følgende: protected void PrepareRecord(string pGUID, int? pRecType, int? pRecProp) { if (pGUID == null || pGUID == "") pGUID = NewGUID(); if (pRecType == 0 || pRecType == null ) pRecType = (int)Constants.FileManager.RecordType.NormalRecord; if (pRecProp == 0 || pRecProp == null) pRecProp = (int)Constants.FileManager.RecordProperty.AllRights; } Resultatet er at det skjer ingen endringer i feltene i det hele tatt etter at metoden er returnert. Så tenkte jeg at REF eller OUT ville løse dette for meg, men da får jeg feilmelding under kompillering at feltene ikke eksisterer allerede i første IF test. Noen som kan hjelpe meg litt her... takker Lenke til kommentar
Glenn F. Henriksen Skrevet 28. august 2008 Del Skrevet 28. august 2008 (endret) Du må bruke ref isteden for out. Out krever ikke at en variabel er tilordnet og dermed kan du ikke bruke den direkte slik du gjør i if setningen din. Out er egentlig for ting som kun skal ut. protected void PrepareRecord(ref string pGUID, ref int? pRecType, ref int? pRecProp) Ref brukes for ting som skal både inn og ut. Grunnen til at det ikke skjer noen endringer uten ref (eller out når det passer) er at string og int er begge value types string og int alltid returnerer en kopi av seg selv. Dvs at når du sender det avgårde sender du en kopi av objektet, ikke en peker/referanse til objektet. Bruk av ref nøkkelordet gjør at programmet sender en referanse til objektet isteden for en kopi. Det er noe som bør unngås siden det medfører boxing og unboxing (dvs å gjøre en value type om til en referanse type og tilbake igjen) noe som er tregt. Hvis dette er kode som skal kjøre mye er det nok en fordel å se på andre måter å gjøre det på. Endret 28. august 2008 av wallatu Lenke til kommentar
HDSoftware Skrevet 28. august 2008 Forfatter Del Skrevet 28. august 2008 Du må bruke ref isteden for out. Out krever ikke at en variabel er tilordnet og dermed kan du ikke bruke den direkte slik du gjør i if setningen din. Out er egentlig for ting som kun skal ut. protected void PrepareRecord(ref string pGUID, ref int? pRecType, ref int? pRecProp) Ref brukes for ting som skal både inn og ut. Grunnen til at det ikke skjer noen endringer uten ref (eller out når det passer) er at string og int er begge value types. Dvs at når du sender det avgårde sender du en kopi av objektet, ikke en peker/referanse til objektet. Bruk av ref nøkkelordet gjør at programmet sender en referanse til objektet isteden for en kopi. Det er noe som bør unngås siden det medfører boxing og unboxing (dvs å gjøre en value type om til en referanse type og tilbake igjen) noe som er tregt. Hvis dette er kode som skal kjøre mye er det nok en fordel å se på andre måter å gjøre det på. Du har helt rett, men problemet mitt lå faktisk et helt annet sted. Som nevnt var nok dette en brainfart ;-) Problemet var at dataene jeg sender inn er properties til tabellene og ikke vanlige stringer og inter. Derfor feilet dette når jeg første gang testet med REF, for REF var jo det jeg egentlig ville. Litt slitsomt dette for da må jeg håndtere dette for absolutt alle tabellene :-( jaja.... sånn kan det gå. Ikke alt som er helt automagisk ;-) Lenke til kommentar
steingrim Skrevet 28. august 2008 Del Skrevet 28. august 2008 Grunnen til at det ikke skjer noen endringer uten ref (eller out når det passer) er at string og int er begge value types. Eh, string er da i aller høyeste grad en reference type? Lenke til kommentar
Glenn F. Henriksen Skrevet 28. august 2008 Del Skrevet 28. august 2008 Grunnen til at det ikke skjer noen endringer uten ref (eller out når det passer) er at string og int er begge value types. Eh, string er da i aller høyeste grad en reference type? String er litt pussig i og med at den egentlig er en reference type men den er uforanderlig (immutable) og oppfører seg som en value type. Så ja, det er forenklet å si at string er en value type men for nesten alle praktiske tilfeller kan man regne den som en value type. Problemet var at dataene jeg sender inn er properties til tabellene og ikke vanlige stringer og inter.Kan du ikke bare sende inn hele objektet da? I ditt tilfelle blir vel det en tabellrad? Lenke til kommentar
steingrim Skrevet 28. august 2008 Del Skrevet 28. august 2008 String er litt pussig i og med at den egentlig er en reference type men den er uforanderlig (immutable) og oppfører seg som en value type. Så ja, det er forenklet å si at string er en value type men for nesten alle praktiske tilfeller kan man regne den som en value type. Forskjellen mellom value-type og reference-type ligger jo ikke i om objektet er immutable eller ei. Value-types ligger på stacken, reference-types på heapen. Det er en vesentlig forskjell. Lenke til kommentar
Glenn F. Henriksen Skrevet 28. august 2008 Del Skrevet 28. august 2008 Som jeg sa, det er en forenkling å kalle det for en value-type, den er det ikke men i de fleste praktiske tilfeller vil den for brukeren oppføre seg likt. Ja, den oppfører seg vesentlig anderledes under panseret og ja, det er en forenkling å kalle den for en value-type. Jeg burde ha presisert det bedre. Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå