[C#] return object by value

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • jos707
  • Registratie: December 2000
  • Laatst online: 22:04
Ik heb wat problemen met het by value/reference principe in C#. Ik heb meer een c++ achtergrond waardoor ik nu in c# wat dingen door elkaar haal.

Ik heb verstaan dat alle objecten in c# bij reference worden doorgegeven.
Nu heb ik een functie die een object returnt, aangezien het over een object gaat wordt er dus een referentie teruggeven. En hier zit juist het probleem aangezien ik geen referentie terug wil van het object maar een kopie van dit object.

Is er een omweg om dit voor elkaar te krijgen?

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
class Foo
{
RicherTextBox m_richTxtBox_main;
CHtmlTag htmlTag;

 public Foo()
 {
  htmlTag = new CHtmlTag();
 }

 public void format_html()
 {
   htmlTag.doe();

        /*
            Hier zit het probleem m_richTxtBox_main verwijst nu naar m_richTxtBox_sub.
            De bedoeling is dat alleen de waarde van m_richTxtBox_sub in m_richTxtBox_main
            wordt gekopieerd.
         */ 
         m_richTxtBox_main = htmlTag.GetRichTxtBox();
 }
}



class CHtmlTag
{

RicherTextBox m_richTxtBox_sub;

 public CHtmlTag()
 {
 m_richTxtBox_sub = new RicherTextBox();
 }

 public doe()
 {
 m_richTxtBox_sub.Text = "Waarde 1";
 }

 public RicherTextBox GetRichTxtBox()
 {
  return m_richTxtBox_sub;
 }

}

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 01:56
jos707 schreef op vrijdag 25 mei 2007 @ 17:31:
Ik heb wat problemen met het by value/reference principe in C#. Ik heb meer een c++ achtergrond waardoor ik nu in c# wat dingen door elkaar haal.

Ik heb verstaan dat alle objecten in c# bij reference worden doorgegeven.
Nee, een object wordt 'by reference' doorgegeven als je het keyword 'ref' gebruikt.
Echter, het is wel zo dat instanties van classes 'reference types' zijn. Dat wil zeggen dat deze instanties op de heap staan, en er op de stack een pointer staat naar de locatie op de heap.
Als jij een object aan een method doorgeeft, dan wordt er in feite die pointer die op de stack staat, doorgegeven aan die method.
Het gevolg hiervan is, dat die method aanpassingen kan doen aan je object, en die aanpassingen ook geldig blijven, als je uit de scope van die method bent.
Wat je in die method niet kan doen, is het 'adres' (wat dus op de stack staat) veranderen. Als je die instance 'by ref' doorgeeft, kan je dat wel.
Nu heb ik een functie die een object returnt, aangezien het over een object gaat wordt er dus een referentie teruggeven. En hier zit juist het probleem aangezien ik geen referentie terug wil van het object maar een kopie van dit object.
Dan zal je moeten clonen.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

Als je alleen de waarde wilt kopieren moet je je programma schrijven dat hij de waarde kopieerd:

m_richTxtBox_main.SetText(htmlTag.GetRichTxtBox().GetText())

Als je wilt dat richTxtBox_main een kopie wordt, dan zul je de clone() of copy() methode moeten gebruiken.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 01:56
Echter, ik denk niet dat er een Clone / Copy method is voor een control.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • jos707
  • Registratie: December 2000
  • Laatst online: 22:04
Janoz schreef op vrijdag 25 mei 2007 @ 17:40:
Als je alleen de waarde wilt kopieren moet je je programma schrijven dat hij de waarde kopieerd:

m_richTxtBox_main.SetText(htmlTag.GetRichTxtBox().GetText())

Als je wilt dat richTxtBox_main een kopie wordt, dan zul je de clone() of copy() methode moeten gebruiken.
Op deze manier kopieer ik niet het object, ik zou willen dat er inderdaad een kopie wordt genomen. Het keyword 'ref' heeft hier geen zin aangezien het hier over classe objecten gaat neem ik aan.
In c++ had je zoiets als een pointer 'de-referencen' waardoor je de eigenlijke waarde van de pointer kon kopieren. Is er een bepaalde tegenhanger in C# hiervoor ?

De achterliggende reden is: m_richTxtBox_main is een control op mijn form die geladen wordt bij het starten van de applicatie. Wanneer ik een ander klasse aanroep waarin een zelfde control staat (m_richTxtBox_sub) met een method die de sub-control in de main-control moet kopieren heb ik steeds het probleem dan na het aanroepen van deze method mijn main-control naar de sub-control refereert.
m.a.w. na het aanroepen van de method heb geen controle meer over de main-control en zal iets eenvoudig zoals m_richTxtBox_main.Text = "hallo" niet op mijn form verschijnen aangezien "hallo" nu in m_richTxtBox_sub staat die geen fysieke control heeft op mijn form.

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16-09 22:43
whoami schreef op vrijdag 25 mei 2007 @ 17:38:
[...]
Nee, een object wordt 'by reference' doorgegeven als je het keyword 'ref' gebruikt.
Volgens mij wordt de reference naar het object by reference doorgegeven als je byref gebruikt, zoniet dan wordt de reference by value doorgegeven.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • EfBe
  • Registratie: Januari 2000
  • Niet online
jos707 schreef op vrijdag 25 mei 2007 @ 17:31:
Ik heb wat problemen met het by value/reference principe in C#. Ik heb meer een c++ achtergrond waardoor ik nu in c# wat dingen door elkaar haal.

Ik heb verstaan dat alle objecten in c# bij reference worden doorgegeven.
Nee, by value :). de value is de reference. Passing by reference is dat je de pointer naar de reference meegeeft, en dat is juist niet aan de orde. Dat gebeurt wanneer je 'ref' gebruikt bij het doorgeven.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ArrayList a = new ArrayList();
Foo(a); // passes 'a' as value
Bar(ref a); // passes reference to reference to a to Bar
// a points now to different arraylist.!
...


public void Foo(ArrayList a)
{
    a.Add("42");
}


public void Bar(ref ArrayList a)
{
    a = new ArrayList();
    a.Add("lalala");
}
Nu heb ik een functie die een object returnt, aangezien het over een object gaat wordt er dus een referentie teruggeven. En hier zit juist het probleem aangezien ik geen referentie terug wil van het object maar een kopie van dit object.
Dan moet je een clone maken. Dus nieuwe instance en die vullen met dezelfde waarde.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com

Pagina: 1