[c#] Immutable Properties ? *

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Synch
  • Registratie: November 2006
  • Laatst online: 18:41
Hoi,

Ik ben nu een tijdje bezig met C#. Tot nu toe vind ik het een geweldige taal, maar nu ben ik iets tegen gekomen wat ik echt niet snap.

Stel ik heb een class Stip:

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
    public class Stip
    {
        private Vector2 _position;
        private int _age;

        public Vector2 Position
        {
            get
            {
                return _position;
            }
            set
            {
                _position = value;
            }
        }
        public int Age
        {
            get
            {
                return _age;
            }
            set
            {
                _age = value;
            }
        }
    }


Nu ben ik het volgende tegen gekomen:
C#:
1
2
Age = 10; //Dit kan
Position.X = 20; //Dit mag niet?? ("Cannot modify the return value of BLA because its not a variable")


Waarom mag ik Age wel veranderen, Position in zijn geheel ook, maar Position.X niet?

Wat ik nu dus zou moeten doen is een method Move(int x, int y) maken?? Dit kan wel, maar dit is toch veel te omslachtig. Ik ben nu dus geneigd om alle properties weg te gooien en te veranderen in Public variabelen. Maar dan kan ik later de variabelen niet meer controleren met get en set.

Ik ben vrij nieuw met c# dus als deze vraag misschien niet duidelijk is meld het dan even.

Alvast bedankt!

ps. ik werk met xna nu dus daarom die Vector2

[ Voor 12% gewijzigd door Synch op 27-05-2008 14:20 ]


Acties:
  • 0 Henk 'm!

  • Kickasz
  • Registratie: April 2003
  • Niet online
Het probleem zit hem waarschijnlijk in dat de Vector2 class de X en Y variabelen als private zijn. Dat betekend dus dat je Position.X niet mag wijzigen. Wat je wel kan doen is een propertie om de X en Y heen te bouwen.

edit:

tsja eerst lezen op MSDN dan reageren |:(


Geef anders eens wat meer code en je volledige foutmelding.

[ Voor 23% gewijzigd door Kickasz op 27-05-2008 14:19 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Kickasz schreef op dinsdag 27 mei 2008 @ 14:12:
Het probleem zit hem waarschijnlijk in dat de Vector2 class de X en Y variabelen als private zijn.
Waarom zouden die private zijn als Position public is? De X en Y properties van Vector2 zijn afaik gewoon public. Wat ik niet snap is de melding "Cannot modify the return value", want er wordt geen "return value" aangepast in dat statement.
@TS: Is dit eigenlijke code? Of een snel geflanst versimpeld voorbeeld? Want ik zie zo 1,2,3 geen probleem.

Oh, en die private vars (_position, _age) zijn overbodig als je met short getters/setters werkt en sterker: waarschijnlijk zal je IDE iets van "The field 'Bla._position' is never used" aangeven.

[ Voor 35% gewijzigd door RobIII op 27-05-2008 14:17 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Synch
  • Registratie: November 2006
  • Laatst online: 18:41
eigenlijke code:
C#:
1
vars.engine_camera.Rotation.X += vars.gamepad.CheckRightStick().Y *2;


ps. de camera class werkt gewoon hetzelfde als het voorbeeld (alleen iets langer en ingewikkelder)
Oh, en die private vars (_position, _age) zijn overbodig als je met short getters/setters werkt en sterker: waarschijnlijk zal je IDE iets van "The field 'Bla._position' is never used" aangeven.
jah sorry, xna werkt in Visual studio 2005 en dit voorbeel dis getypt in 2008, ik zal het aanpassen.
Geef anders eens wat meer code en je volledige foutmelding.
Dit is de enige relevante code en de volledige foutmelding is:
code:
1
Error   1   Cannot modify the return value of 'Engine.Objects.Camera.Rotation' because it is not a variable blablabla\test_3d.cs    70  5   test_3d

[ Voor 106% gewijzigd door Synch op 27-05-2008 14:23 ]


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:07
Vector2 is een structure, wat een value type is, en als immutable zal geimplementeerd zijn.
Vandaar dat je de properties van die structure niet zult mogen veranderen.

Maareh, gaat het hier nu over je eigen class, of over die Rotation property van Camera ?

De getter Rotation property zal nl altijd een nieuw object returnen, waardoor de compiler niet toelaat dat je de properties van het gereturnede object kunt wijzigen.

Kijk, doe maar eens dit:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        private void button2_Click( object sender, EventArgs e )
        {
            Melp m = new Melp ();
            m.Positie.X = 5;
        }

        public class Melp
        {
            int x, y;

            public Point Positie
            {
                get
                {
                    return new Point (x, y);
                }
            }
        }
Je zal hetzelfde 'probleem' hebben.

[ Voor 80% gewijzigd door whoami op 27-05-2008 14:36 ]

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Synch
  • Registratie: November 2006
  • Laatst online: 18:41
Voor zover ik heb gelezen over immutable betekent het dat nadat je een instance maakt die immutable is je het niet meer aan kan passen?

Waarom kan mijn code dan niet en:

code:
1
2
Vector2 vec = new Vector2(10, 10);
vec.X = 20;


wel?

Weet iemand anders een pagina waar het goed uitgelegd staat, want als ik op google zoek dan worden immutable types alleen de hemel in geprezen.

edit:

@whoami: het gaat hier om de voorbeeld class, de camera class is eigenlijk precies hetzelfde.
Maar door jouw uitleg snap ik het nu wat beter.

[ Voor 16% gewijzigd door Synch op 27-05-2008 14:39 ]


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:07
Immutable types zijn goed als het gaat over 'value' types. Types waar de 'identiteit' van het object je je niet interesseert, bv. een 'punt in een assenstelsel'.
Je bent niet geinteresseerd in het 'id' van het punt, maar wel in zijn 'waarde' (zijn X & Y waarde). Als je de X of de Y waarde van het punt veranderd, dan zou dit eigenlijk in een nieuw punt moeten resulteren, en dat kan je afdwingen door het punt als immutable te implementeren.

Die rotation property van Camera hebben ze dus als immutable geimplementeerd door in de getter van die property, telkens een nieuw object te returnen.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Synch
  • Registratie: November 2006
  • Laatst online: 18:41
Oke,

dus wat ik met het voorbeeld zou moeten doen is (pseudo code):
code:
1
2
3
vector2 newposition = Mijnstip.Position;
newposition.x = 10;
mijnstip.position = newposition;

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:22

.oisyn

Moderator Devschuur®

Demotivational Speaker

whoami schreef op dinsdag 27 mei 2008 @ 14:24:
Kijk, doe maar eens dit:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        private void button2_Click( object sender, EventArgs e )
        {
            Melp m = new Melp ();
            m.Positie.X = 5;
        }

        public class Melp
        {
            int x, y;

            public Point Positie
            {
                get
                {
                    return new Point (x, y);
                }
            }
        }
Je zal hetzelfde 'probleem' hebben.
Je voorbeeld gaat ook op als je x en y gewoon in een Point had staan die je returnt (zoals de Vector2 van de topicstarter). Omdat het een value-type is, werk je met een kopie van de structure, en niet met het origineel. Het heeft dus niets met immutable van Vector2 zijn te maken, maar meer met het feit dat een structure aanpassen die door een functie gereturnd (want dat is het lezen van een property) onzinnig is:
C#:
1
2
3
4
5
6
7
8
9
10
class Aap
{
    private Vector2 vec;

    public Vector2 GetVec() { return vec; }
};

// ...
Aap aap = new Aap();
aap.GetVec().X = 34; // onzin
ozakigames schreef op dinsdag 27 mei 2008 @ 14:44:
Oke,

dus wat ik met het voorbeeld zou moeten doen is (pseudo code):
code:
1
2
3
vector2 newposition = Mijnstip.Position;
newposition.x = 10;
mijnstip.position = newposition;
Of:
C#:
1
Mijnstip.Position = new Vector2(10, Mijnstip.Position.Y);
;)

[ Voor 20% gewijzigd door .oisyn op 27-05-2008 18:07 ]

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!

  • Synch
  • Registratie: November 2006
  • Laatst online: 18:41
Oke bedankt voor de uitleg allemaal!
Pagina: 1