Toon posts:

[C#] string als referentietype

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
In een boek over Visual C# staat het volgende:

Bij een waardetype kopieert het teken = de waarde zelf.
Bij een referentietype kopieert het teken = de referentie naar de waarde en niet de waarde zelf.


Zo wordt de string als voorbeeld genoemd van een referentietype. Om dat eens uit te proberen heb ik de volgende code gebruikt:

C#:
1
2
3
4
5
6
7
8
9
string naamA, naamB;

naamA = "Henk";
naamB = "Pieter";

naamB = naamA;
naamA = "Jan";

MessageBox.Show("Naam A: " + naamA + ", naam B: " + naamB);


Omdat de string een referentietype is verwacht ik dus dat naam B nu verwijst naar naam A en dat als ik de waarde van naam A wijzig dat dus ook zal gebeuren met naam B.

Echter is dat niet het geval en komt de string op mij meer over als een waardetype. Enig idee wat ik fout doe?

Acties:
  • 0 Henk 'm!

Verwijderd

String is een speciale referencetype. Deze doet alsof hij een valuetype is, een zogenoemd immutable referencetype.

Acties:
  • 0 Henk 'm!

  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Omdat de string een referentietype is verwacht ik dus dat naam B nu verwijst naar naam A
Klopt, dat gebeurt ook.
en dat als ik de waarde van naam A wijzig dat dus ook zal gebeuren met naam B.
Je uitspraak klopt, maar dat is niet wat er in je codefragment gebeurt. Je verandert nl. niet de waarde van naamA, je kent er een nieuw object aan toe ("Jan"). En dat heeft natuurlijk geen effect op naamB.

Expliciet uitgeschreven doe je dus eigenlijk het volgende in je code:
C#:
1
2
3
4
5
6
7
8
9
string naamA, naamB;

naamA = new string("Henk");
naamB = new string("Pieter");

naamB = naamA;
naamA = new string("Jan");

MessageBox.Show("Naam A: " + naamA + ", naam B: " + naamB);
Echter is dat niet het geval en komt de string op mij meer over als een waardetype. Enig idee wat ik fout doe?
Dat is ook precies het idee, dat een string zich net zo gedraagt als zeg, een int. :)

[ Voor 17% gewijzigd door MrBucket op 24-01-2009 12:55 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bedankt voor jullie reacties. Het is al een stuk duidelijker.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-09 16:37

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op zaterdag 24 januari 2009 @ 12:41:
Omdat de string een referentietype is verwacht ik dus dat naam B nu verwijst naar naam A en dat als ik de waarde van naam A wijzig dat dus ook zal gebeuren met naam B.
Nee. Zo werken references niet. Je laat naamB helemaal niet wijzen naar naamA. naamA wijst naar een object (de string "Henk"), en dus laat je naamB ook naar dat object wijzen. De waarden van naamA en naamB zijn in feite slechts de verwijzing zelf, niet de objecten waarnaar verwezen wordt. Als je dus naamA naar een ander object laat wijzen, dan verandert niet het object zelf, alleen de verwijzing.

Lees anders ook even deze post door: .oisyn in "[ALG] Object References" :)
Verwijderd schreef op zaterdag 24 januari 2009 @ 12:49:
String is een speciale referencetype. Deze doet alsof hij een valuetype is, een zogenoemd immutable referencetype.
Sorry, maar dit slaat nergens op. Een string is een class, en dus een reference type. Dat hij daarbij immutable is doet er verder compleet niet toe. Je kunt net zo goed mutable reftypes hebben, of immutable value types (structs). Dat verandert echter niet het gedrag van de assignments.

[ Voor 4% gewijzigd door .oisyn op 25-01-2009 00:35 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

Verwijderd

.oisyn schreef op zondag 25 januari 2009 @ 00:28:
Dat verandert echter niet het gedrag van de assignments.
Ik was iets te snel met mijn antwoord. Dat verandert inderdaad niet het gedrag van de assignments.

Maar mocht de topic starter verder gaan met C# leren, dan zal hij dit wel tegen gaan komen als je strings gaat vergelijken. Dan worden niet de refernties vergeleken, zoals by reference types, maar de values.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-09 16:37

.oisyn

Moderator Devschuur®

Demotivational Speaker

Idd. Strings zijn daarin overigens geen uitzondering. C# ondersteunt operator overloading, en elke class kan in principe gewoon de == operator overloaden. Als je references van willekeurige objecten wilt vergelijken is het sowieso aan te raden om object.ReferenceEquals() te gebruiken ipv ==

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1