Toon posts:

[C#] Reference Operator (&)

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik wil een reference naar een object meesturen van het object dat het andere object aanroept:

ik heb zelf nu zoiets, naar wat ik d8 na de MSDN gelezen te hebben, maar het werkt dus niet:
code:
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
using System;

public class Voorwerp
{
    public int hoi;
    private Voorwerp* refVoorwerp = &this;

    public Voorwerp (int invoer)
    {
        hoi = invoer;
    }

    public void MaakNieuw (int blaat)
    {
        Nieuw.Test (hoi, refVoorwerp);
    }
}

public class Nieuw
{
    public static void Test (int jaja, Voorwerp* refvoorwerp)
    {
        Console.WriteLine (*refvoorwerp.hoi * jaja);
    }
}

public class Test
{
    public static void Main ()
    {
        Voorwerp hoi = new Voorwerp (6);
        hoi.MaakNieuw (8);
    }
}

hier gaat ie zeiken over unsafe content, en over dat ik geen '.' in een de operand *refvoorwerp mag ofzo.

zoeken op google naar "C# & reference" gaf wel hits, maar niet wat ik zocht :+

en de search hiero kan geen # accepteren, dus hier kon ik ook nix vinden. Hoe kan ik mijn probleem oplossen met een reference meesturen?

oh ja, ik kon er een een child van maken, maar dan moet ik iets heel vaags doen met een id en : base(id) achter mijn constructor zetten ofzo, dus dat is me ook nog niet gelukt om goed parent&child classes te maken, vandaar dat ik het met een reference probeerde.

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:59
Ik denk dat je je een beetje in .NET en C# zult moeten gaan verdiepen. C# is nl. geen C++, al lijkt het er sterk op.
Je kan bv. niet zomaar een pointer gaan gebruiken in C#, want dat levert 'unsafe' code op. Als je pointers gaat gaan gebruiken (wat overigens niet aangeraden wordt in .NET), dan moet je dat blok code als unsafe markeren.
code:
1
2
3
4
unsafe
{
..unsafe code..
}

En een object moet je ook niet als pointer doorgeven naar functies, in .NET heb je 2 soorten types: value - types en reference types.
Alle primitieven zijn zowieso value-types, net als structs.
Objecten zijn reference types en die worden dus zo al als reference doorgegeven naar een functie.

Als je C# wilt leren, kan ik je het volgende boek aanraden:
Professional C#
Uitgeverij Wrox
ISBN: 1-861004-99-0

https://fgheysels.github.io/


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Hum .... heb je al eens bekeken wat de standaard manier is waarop in C# objecten worden meegegeven?

In de SDK is vrachten documentatie te vinden (onder Reference/Compiler and Language Reference/C# ) en een goed boek kan uiteraard ook nooit kwaad ;) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Hier een kleine rewrite van je (vage ;) ) code:
code:
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
using System;

public class Voorwerp {

  public readonly int hoi;

  public Voorwerp (int invoer) {
    hoi = invoer;
  }

  public void MaakNieuw (int blaat) {
    Nieuw.Test (hoi, this);
  }
}

public class Nieuw {

  public static void Test (int jaja, Voorwerp voorwerp) {
    Console.WriteLine("Value: " + voorwerp.hoi * jaja);
  }
}

public class Test {
  public static void Main () {
    Voorwerp hoi = new Voorwerp (6);
    hoi.MaakNieuw (8);
  }
}

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Topicstarter
ik heb al boek over .NET en C# gelezen, maar daar stond dit nie in...

dus als ik dit doe
code:
1
2
Voorwerp hoi = new Voorwerp (8);
Voorwerp doei = hoi;

dan is doei geen instance van Voorwerp, maar een reference naar het object hoi?

dat zou schelen :)

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
'doei' is een variabele met als waarde een instantie van Voorwerp. Als je een andere Voorwerp instantie toewijst aan 'hoi', blijft de variabele 'doei' wijzen naar het object waar 'hoi' eerst naar toewees.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Anders gezegd: doei heeft niets met hoi te maken, behalve dat ze wijzen naar hetzelfde object als de code hierboven is uitgevoerd :) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • whoami
  • Registratie: December 2000
  • Laatst online: 11:59
Op zondag 16 juni 2002 22:51 schreef K-Mile het volgende:
ik heb al boek over .NET en C# gelezen, maar daar stond dit nie in...
Dan had je geen goed boek te pakken denk ik...
dus als ik dit doe
code:
1
2
Voorwerp hoi = new Voorwerp (8);
Voorwerp doei = hoi;

dan is doei geen instance van Voorwerp, maar een reference naar het object hoi?

dat zou schelen :)
Met die code 'wijzen' hoi en doei naar hetzelfde object, stuk geheugen op de heap. Dwz, als je wat veranderd in hoi, en je toont de gegevens waar doei naar verwijst, dan zul je die veranderingen ook zien. Ze wijzen immers alletwee naar dezelfde plek in het geheugen.

https://fgheysels.github.io/


Verwijderd

Topicstarter
problem solved :)

ik d8 idd dat ie een nieuwe instance aanmaakte als je hem onder een ander objectnaam plakte, maar het blijft een reference naar dat object, dus ik heb gewoon 'this' meegegeven en die in de tweede functie gebruikt...

edit: thanx voor reacties, even proefondervindelijk kwam ik er zelf ook achter :)
code:
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
using System;

public class hoi
{
    public int lol = 4;
    public hoi (int doei)
    {
        lol = doei;
        hoi reference = this;
        dag.test (reference);
    }
}

public class dag
{
    public static void test (hoi blaat)
    {
        Console.WriteLine (blaat.lol);
    }
}

public class test
{
    public static void Main ()
    {
        hoi testing = new hoi (6);
    }
}

geeft als output 6, en niet 4 :P was even gaar hersenspinsel van mij, ik weet niet hoe ik eraan kom, in PHP bijv. altijd reference '&' gebruikt... maar dat gaat dus niet zo makkelijk in C# en is (meestal) niet nodig..


edit: verwarrend foutje uit de code gesloopt

Verwijderd

kijk eens bij keyword 'ref'. :)

Objects worden altijd meegegeven als reference, value types altijd als value. Dan heb je dus 'ref' nodig om references mee te geven.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 00:52
Op zondag 16 juni 2002 23:07 schreef K-Mile het volgende:
code:
1
2
3
4
5
6
7
8
....
public class hoi
{
    public hoi (int doei)
    {
        hoi reference = new this;
    }
}
Leg die eens uit want daar snap ik nix van.

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.


  • whoami
  • Registratie: December 2000
  • Laatst online: 11:59
Ik vind die ene regel toch ook behoorlijk vaag.

https://fgheysels.github.io/


Verwijderd

Topicstarter
hmz, daar hoort geen 'new' te staan :D

ik had er ff new in gezet om te zien wat ie dan doet... maar daar hoort dus GEEN 'new' te staan

hopelijk duidelijker :D

en ik gebruikte zowieso een heleboel zooi fout in mijn eerste probeersel, dus weer een hele hoop geleerd :)

  • Scare360
  • Registratie: Juli 2001
  • Laatst online: 27-08 08:10
vreemd dat er maar 1 persoon is die de vraag oppikt :?
code:
1
PaasDitObjectByRef(ref object){}

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:59
Op maandag 17 juni 2002 15:38 schreef paulgielens het volgende:
vreemd dat er maar 1 persoon is die de vraag oppikt :?
Objecten worden toch zowieso al by reference doorgegeven, dus hoeft dat ref keyword daar toch niet?

https://fgheysels.github.io/


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
paulgielens: vreemd dat er maar 1 persoon is die de vraag oppikt :?
Mwah, ik denk dat m'n eerste twee posts al een aardig beeld scheppen ;) .
whoami: Objecten worden toch zowieso al by reference doorgegeven, dus hoeft dat ref keyword daar toch niet?
Nee, de pointer naar een object wordt by-value doorgegeven, net als in Java. In het stukje wat paulgielens post gebeurt er iets heel anders.

Dit maakt het wel duidelijk:
code:
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
using System;

public class Voorwerp {

  public readonly int hoi;

  public Voorwerp (int invoer) {
    hoi = invoer;
  }
}

public class Test {
  public static void Main () {

    Voorwerp voorwerp = new Voorwerp(4);

    Console.WriteLine("Value: " + voorwerp.hoi);

    Value(voorwerp);
    Console.WriteLine("Value: " + voorwerp.hoi);

    Reference(ref voorwerp);
    Console.WriteLine("Value: " + voorwerp.hoi);
  }

  public static void Value(Voorwerp voorwerp) {
    voorwerp = new Voorwerp(6);
  }

  public static void Reference(ref Voorwerp voorwerp) {
    voorwerp = new Voorwerp(6);
  }
}

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Het is trouwens idd best verwarrend. Java kent zogenaamd alleen pass-by-value omdat de pointers naar objecten dus by-value worden doorgegeven. Het meegeven van instanties van objecten worden echt over het algemeen omschreven als 'by-reference'.

In mijn eerste stukje C# code (zie 3e post) wordt de pointer naar het object by-value meegegeven. Dit is meestal wat je wilt imho. In het stukje van paulgielens (en verder uitgewerkt in m'n voorbeeld van net) wordt ook de pointer naar het object by-reference doorgegeven en is het dus mogelijk om een variabele in de aanroepende methode te laten wijzen naar een object.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment

Pagina: 1