Vinnaren i pepparkakshustävlingen!
2017-06-01, 13:40
  #1
Medlem
Har aldrig gått igenom detta och ser nu detta i min lärobok, förstår inte riktigt vad som menas med detta? Någon som kan bidra?

Input : Type obj1 , Type obj2 ;
obj1 .setA(10);
obj2 = obj1;
obj2 .setA(20);
obj1 .setA(30);

Beskriv effekterna av kodavsnittet och hur de skiljer sig åt beroende på om Type är en värdetyp eller referenstyp.
Citera
2017-06-01, 14:51
  #2
Moderator
Protons avatar
Citat:
Ursprungligen postat av Doggepe
Har aldrig gått igenom detta och ser nu detta i min lärobok, förstår inte riktigt vad som menas med detta? Någon som kan bidra?

Input : Type obj1 , Type obj2 ;
obj1 .setA(10);
obj2 = obj1;
obj2 .setA(20);
obj1 .setA(30);

Beskriv effekterna av kodavsnittet och hur de skiljer sig åt beroende på om Type är en värdetyp eller referenstyp.
Man kan börja med att läsa https://en.wikipedia.org/wiki/Evalua...l_by_reference och https://en.wikipedia.org/wiki/Evalua...#Call_by_value för att få en uppfattning om vad det handlar om.

Det som åsyftas är alltså om obj1 och obj2 är referenser till ett objekt, eller ett konkret värde.

I fallet med referenser skulle du med raden
Kod:
obj2 = obj1; 
skriva över referensen obj2 så att den pekar på obj1 istället. Det innebär att en användning av ob2 kommer framöver ge samma resultat som om obj1 användes. Om du alltså ändrar något med referensen obj1 kommer du kunna se förändringen om du sedan använder obj2. beroende på att de pekar på samma objekt.

I fallet värde så får du en kopia gjord. Det innebär att raden
Kod:
obj2 = obj1; 
kommer tilldelas värdet, men ej referensen, det är fortfarande 2 olika objekt som åsyftas.

Ändrar du något med obj2 kommer obj1 ändå hålla sitt gamla värde, för det är två olika objekt, de refererar inte till samma minnesarea.

Aningen svårt att beskriva med text, man skulle behöva rita några streck med, men förhoppningsvis blev det lite klarare?
Citera
2017-06-01, 15:00
  #3
Medlem
Jag håller med Proton, det är knepigt att beskriva i text. Det kanske klarnar om du gör ett experiment.

Klasser är referenstyper i c#, och structer är värdetyper. Så du skulle kunna skapa dig en klass och en struct (ex MyClass och MyStruct) som både exponerar en property A och testa din kod mot det!
Kod:
public class MyClass
{
    public int A { get; set; }
}
public struct MyStruct
{
    public int A { get; set; }
}
Kör och debugga, eller skriv till console om du så vill, värdet på obj2.A i slutet av koden.
Kod:
MyClass obj1 = new MyClass();
MyClass obj2;
obj1.A = 10;
obj2 = obj1;
obj2.A = 20;
obj1.A = 30;
Byt sedan mot MyStruct istället, så kommer du se skillnaden.
Citera
2017-06-01, 15:17
  #4
Moderator
Protons avatar
Citat:
Ursprungligen postat av Blippster
Jag håller med Proton, det är knepigt att beskriva i text. Det kanske klarnar om du gör ett experiment.

Klasser är referenstyper i c#, och structer är värdetyper. Så du skulle kunna skapa dig en klass och en struct (ex MyClass och MyStruct) som både exponerar en property A och testa din kod mot det!
Kod:
public class MyClass
{
    public int A { get; set; }
}
public struct MyStruct
{
    public int A { get; set; }
}
Kör och debugga, eller skriv till console om du så vill, värdet på obj2.A i slutet av koden.
Kod:
MyClass obj1 = new MyClass();
MyClass obj2;
obj1.A = 10;
obj2 = obj1;
obj2.A = 20;
obj1.A = 30;
Byt sedan mot MyStruct istället, så kommer du se skillnaden.
Föreningen för inbördes beundran lyfter på hatten för exemplet, det där borde kunna göra det hela väldigt tydligt vad som sker ja.
Citera
2017-06-01, 15:57
  #5
Medlem
Citat:
Ursprungligen postat av Proton
Man kan börja med att läsa https://en.wikipedia.org/wiki/Evalua...l_by_reference och https://en.wikipedia.org/wiki/Evalua...#Call_by_value för att få en uppfattning om vad det handlar om.

Det som åsyftas är alltså om obj1 och obj2 är referenser till ett objekt, eller ett konkret värde.

I fallet med referenser skulle du med raden
Kod:
obj2 = obj1; 
skriva över referensen obj2 så att den pekar på obj1 istället. Det innebär att en användning av ob2 kommer framöver ge samma resultat som om obj1 användes. Om du alltså ändrar något med referensen obj1 kommer du kunna se förändringen om du sedan använder obj2. beroende på att de pekar på samma objekt.

I fallet värde så får du en kopia gjord. Det innebär att raden
Kod:
obj2 = obj1; 
kommer tilldelas värdet, men ej referensen, det är fortfarande 2 olika objekt som åsyftas.

Ändrar du något med obj2 kommer obj1 ändå hålla sitt gamla värde, för det är två olika objekt, de refererar inte till samma minnesarea.

Aningen svårt att beskriva med text, man skulle behöva rita några streck med, men förhoppningsvis blev det lite klarare?


Ja, tack!
Citera
2017-06-01, 19:30
  #6
Moderator
Protons avatar
Citat:
Ursprungligen postat av Doggepe
Ja, tack!
Prova även att köra kodexemplet som nån annan skribent fixade ihop här ovanför, där och då tror jag polletten kommer ramla på plats.
Citera
2017-06-01, 19:41
  #7
Medlem
tj.s avatar
Jon Skeet, som är något av en rockkändis i .Net-världen, har skrivit den här artikeln om reference vs. value types som kan vara matnyttig.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback