Gå til innhold

Anbefalte innlegg

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
Videoannonse
Annonse

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 av wallatu
Lenke til kommentar
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
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
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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...