Gå til innhold

Anbefalte innlegg

Har en liten sak her som går på dette med OUT. Jeg har hele tiden trodd at ved å bruke OUT så blir parameteret overført som en referanse. Står i hvertfall det i hjelpe, men følgende problem oppstår hos meg:

void SomeProc(OUT SortedList<String, String> Q)
{
  // Bruke Q her gir "Use of unassigned out parameter Q
}

 

Har også prøvd å instansere Q før jeg kaller metoden uten at det hjelper noe. Hva gjør jeg feil?

Lenke til kommentar
Videoannonse
Annonse

Out-parametere er ikke det samme som by-reference parametere. Hvis du vil overføre parameter som referanse bruduer du 'ref' keywordet, ikke 'out'.

 

En out-parameter kan tenkes på som en "ekstra" returverdi. En out-parameter MÅ tilordnes en verdi i metodens skop, slik at kalleren kan garantere at den har fått en verdi etter. Feks:

 

object foo;
minMetode(out foo);
// foo er garantert tilordnet noe, men det kan være null.

Lenke til kommentar
Out-parametere er ikke det samme som by-reference parametere. Hvis du vil overføre parameter som referanse bruduer du 'ref' keywordet, ikke 'out'.

 

En out-parameter kan tenkes på som en "ekstra" returverdi. En out-parameter MÅ tilordnes en verdi i metodens skop, slik at kalleren kan garantere at den har fått en verdi etter. Feks:

 

object foo;
minMetode(out foo);
// foo er garantert tilordnet noe, men det kan være null.

Javel? Hva med dette som er hentet fra hjelp:

class OutExample
{
static void Method(out int i)
{
	i = 44;
}
static void Main()
{
	int value;
	Method(out value);
	// value is now 44
}
}

Dette er jo akkurat det samme som jeg viste til innledningsvis, men i mitt tilfelle virker det ikke

Lenke til kommentar
Nei, det du sa var at hvis du brukte Q i metodekroppen så fikk du "use of unassigned variable", som er helt korrekt. Metoden Method som du limte inn over bruker ikke variabelen i før den tilordner den verdien 44.

ok. Her er koden min i sin helhet (neste da ;-):

int GetAccessRighst(Parameters)
{
 SortedList<GUIDManger.GUIDType, RestrictionsQueueClass> Q = new SortedList<GUIDManager.GUIDType, RestrictionsQueue>();
 if(FillRestrictionsQueue(Parameters, out Q))
 {
foreach(KeyValuePair<GUIDManager.GUIDType, RestrictionsQueueClass> rec in Q)
{
	/ Handle the record
}
 }
}

Boolean FillRestrictionsQueue(GUIDManager.GUIDType pEntityGUID, out SortedList<GUIDManager.GUIDType, RestrictionsQueue> Q)
{
Og det er her alle referansert til Q er ugyldige.
}

 

Mener du at hvis jeg her endrer fra OUT til REF så vil det virke? Må prøve...

Lenke til kommentar

Hvis du har out på et parameter, MÅ du legge en verdi i det parameter, ref derimot er ikke slik.

 

void SomeFunction(out int my_var)
{
 return; // Feil, det er ikke satt noen verdi i my_var
}
void SomeFunction(out in my_var)
{
 my_var = 100;
 return; // OK, my_var er blitt satt
}

void Main()
{
 int ret = 0;
 SomeFunction(out ret);
}

 

void SomeFunction(ref my_var)
{
 return; // OK, my_var er referanse
}
void Main()
{
 int ret = 0;
 SomeFunction(ref my_var);
}

Lenke til kommentar

Helt riktig som Geir sier her, litt mer detaljert enn da jeg forklarte det. MEN jeg ser at du bruker out (og vil bruke ref) på SortedList<T>. Det gir liten mening å bruke call-by-reference på en reference-type som SortedList<T>, det vil ikke være noen forskjell med og uten. Jeg mistenker at du har hengt deg opp i noe Clarion-greier :)

 

Out og Ref-parametere er fint for value-types, men gir liten mening for reference-types.

Lenke til kommentar
Helt riktig som Geir sier her, litt mer detaljert enn da jeg forklarte det. MEN jeg ser at du bruker out (og vil bruke ref) på SortedList<T>. Det gir liten mening å bruke call-by-reference på en reference-type som SortedList<T>, det vil ikke være noen forskjell med og uten. Jeg mistenker at du har hengt deg opp i noe Clarion-greier :)

 

Out og Ref-parametere er fint for value-types, men gir liten mening for reference-types.

 

Takker for dette svaret. Var vel egentlig et godt nok svar på min problemstilling.

 

Ole

Lenke til kommentar
Helt riktig som Geir sier her, litt mer detaljert enn da jeg forklarte det. MEN jeg ser at du bruker out (og vil bruke ref) på SortedList<T>. Det gir liten mening å bruke call-by-reference på en reference-type som SortedList<T>, det vil ikke være noen forskjell med og uten. Jeg mistenker at du har hengt deg opp i noe Clarion-greier :)

 

Out og Ref-parametere er fint for value-types, men gir liten mening for reference-types.

 

Takker for dette svaret. Var vel egentlig et godt nok svar på min problemstilling.

 

Ole

Dette stemte faktisk ikek helt!

 

Tok vekk OUT og da feiler programmet med en gang.

 

Husk, at koden min er slik at listen faktisk ikek er instansert i den kallende metoden og derfor eksisterer den ikke når jeg kaller den metoden som skal tilbakeføre en liste. En løsning er selvsagt å instansere listen før jeg kaller metoden, men hensikten er jo at metoden selv skal opprette et objekt som returneres. Dette er selvsagt flisespikkeri, men det har kunn med hvordan man bestemmer seg for at dette skal virke:

Enten må listen instanseres og sendes inn i metoden, ellers må den instanseres i den kallede metoden. Hva som er best er jo en smaksak, men gjør man det i den kallede metoden så vil man alltid være sikker på at det man får tilbake er gyldig. På den annen side kan man tenke slik at man alltid skal definere hva man vil bruke før man brukere det for å være sikker på å unngå exceptions, men som sagt, en smak sak.

En tredje måte, som kansje ville vært den beste, kunne jo vært at hele rukkelet kunne vært lagt inn som en konstruktør på listen. Hmmm. Det var faktisk en god ide ;-)

 

Og nei! Dette har ingenting med hvordan Clarion gjør det. I Clarion vil en metoden som sender en "named type" (slik som collections, structs, etc.) alltid være By Reference, med andre ord akkurat på samme måte.

Lenke til kommentar
Enten må listen instanseres og sendes inn i metoden, ellers må den instanseres i den kallede metoden.

Hvis den skal instantieres i den kalte metoden så bør du returnere listen, og ikke void slik du gjør. Å returnere via out-parametre er ikke det første du bør tenke på.

Lenke til kommentar
Enten må listen instanseres og sendes inn i metoden, ellers må den instanseres i den kallede metoden.

Hvis den skal instantieres i den kalte metoden så bør du returnere listen, og ikke void slik du gjør. Å returnere via out-parametre er ikke det første du bør tenke på.

Er i prinsippet enig med deg i det.

Lenke til kommentar

Det Geir sier er helt rett; objekter med out må tilordnes i funksjonen. Og det ser det ikke ut som du gjør.

Omtrent slik:

Boolean FillRestrictionsQueue(GUIDManager.GUIDType pEntityGUID, out SortedList<GUIDManager.GUIDType, RestrictionsQueue> Q)
{
   Q = new SortedList<GUIDManager.GUIDType, RestrictionsQueue>();  // voila.
}

 

- grå -

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