Når en funktion kaldes i C# overføres argumenterne som regel by-copy. Det vil sige at hvis du kalder en funktion med f.eks. en int som argument, kan du ikke udenfor funktionen se ændringer til argumentet....
Ja, hvis det er en primitiv datatype. Det er almindelige variable der er tale om, hvis du sender et objekt med ned, er det jo altid by reference, mens primitive datatyper altid er by value.
Nej, det er ikke helt korrekt. Det er rigtig at selve objektet ikke kopieres. Men det er stadig by-copy - det er blot referencen der kopieres. Derfor er der forskel på om du bruger ref eller ikke ref også når argumentet er en objekterference.
Hvis dit argument er en reference til et objekt, og du kalder en metode uden
ref, altså bruger by-copy, kopieres referencen (og ikke objektet). Så hvis du f.eks. inde i metoden sætter referencen til at pege på et andet objekt påvirker det ikke den oprindelige reference (som stadig vil pege på det første objekt.
Hvis du derimod bruger
ref med en objektreference kopieres referencen ikke, men i stedet er argumentet nu en reference til en reference. Det betyder at hvis du inde i metoden sætter referencen til at peget på et nyt objekt vil den oprindelige reference udenfor metoden nu også pege på det nye objekt.
Uden ref er metodekald altid by-copy. Hvad der kopieres er forskellig afhængig hvad slags datatype argumentet er:
Hvis argumentets datatype er:
*en primitiv datatype, eller en struct, kopieres hele objektet
*en objektreference kopieres referencen
Hvis du bruger
ref ved metodekald, og argumentets datatype er:
*en primitiv datatype eller struct, er parameteren inde i metoden nu en reference til det oprindelige objekt som nu kan ændres inde i metoden
*en objektreference, er parameteren inde i metoden nu en reference til en objektreference, så nu kan du faktisk både manipulere det oprindelige objekt, men også den oprindelige reference (f.eks. ved at lade den peget på et nyt objekt)
Indlæg senest redigeret d. 04.02.2008 12:04 af Bruger #4522