Toon posts:

[C#] public data-types via classes

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoi,

Wat is de beste manier om in C# te werken met globale variabelen?

Ik heb 1 class (Class1) en 2 forms (Form1, Form2).

In beide forms wil ik gebruik maken van Class1, dus heb ik in beide forms het volgende:
private Class1 myClass = new Class1();

In die class heb ik een aantal public strings.

Maar, wanneer ik nu vanuit Form1 een public string in de class in vul, kan ik die NIET in Form2 uitlezen, de string is dan simpelweg leeg. Opzich bij nader inzien ook logisch, omdat ik een *nieuwe* instance van de class open in beide forms.

Is er een manier om in alle forms gebruik te maken van dezelfde class-instance, zodat de public type's overal dezelfde waarde hebben?

  • Juicy
  • Registratie: December 2000
  • Laatst online: 09:46
Kijk eens naar een singleton of maak gebruik van een static class.

-


  • riezebosch
  • Registratie: Oktober 2001
  • Nu online
Hoe verhouden Form1 en Form2 zich ten op zichte van elkaar? Als Form1 een instantie van Form2 aanmaakt zou je Class1 als parameter mee kunnen geven. Als ze beiden vanuit dezelfde class geïniteerd worden zou je ook in die class Class1 aan kunnen maken en dan een ref van Class1 aan beide Forms mee kunnen geven.

Wat de standaard procedure is weet ik eerlijk gezegd niet.

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • whoami
  • Registratie: December 2000
  • Laatst online: 20:40
Verwijderd schreef op woensdag 16 maart 2005 @ 04:37:

Wat is de beste manier om in C# te werken met globale variabelen?
Niet werken met globale variablen.
Ik heb 1 class (Class1) en 2 forms (Form1, Form2).

In beide forms wil ik gebruik maken van Class1, dus heb ik in beide forms het volgende:
private Class1 myClass = new Class1();

In die class heb ik een aantal public strings.

Maar, wanneer ik nu vanuit Form1 een public string in de class in vul, kan ik die NIET in Form2 uitlezen, de string is dan simpelweg leeg. Opzich bij nader inzien ook logisch, omdat ik een *nieuwe* instance van de class open in beide forms.

Is er een manier om in alle forms gebruik te maken van dezelfde class-instance, zodat de public type's overal dezelfde waarde hebben?
Uit de FAQ:
[rml]whoami in "[ VB.NET] waardes van een andere form?"[/rml]

https://fgheysels.github.io/


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 10:05
Als beide forms hetzelfde object nodig hebben, geef je em toch gewoon door als je het form opent oid. ( Evt laat je een derde object de 'manager' zijn van dat object )

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.


  • riezebosch
  • Registratie: Oktober 2001
  • Nu online
farlane schreef op woensdag 16 maart 2005 @ 09:43:
Als beide forms hetzelfde object nodig hebben, geef je em toch gewoon door als je het form opent oid. ( Evt laat je een derde object de 'manager' zijn van dat object )
Bedoelde ik ook met het 2e stukje :P

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


Verwijderd

Topicstarter
Hoe verhouden Form1 en Form2 zich ten op zichte van elkaar?
Form1 en Form2 is natuurlijk even als voorbeeld, om het makkelijk te houden. Maar ik heb een frmMain, dat is een MDI container, dus wordt natuurlijk als eerste geopend, en daarna de childs. Dus de class wordt als eerste in frmMain aangeroepen, dus dat vergemakkelijkt het denk ik wel.

Delegates heb ik me nog niet echt in verdiept, ziet er wel heel interessant uit, maar voor mijn class-issue moet denk ik een makkelijkere oplossing zijn. Ik wil gewoon in de class wat gegevens bij houden die ik overal waar ik wil, in welk form dan ook kan gebruiken of aanpassen.

Even MSDN gechecked voor singleton."How do you make an instance of an object globally available and guarantee that only one instance of the class is created?". Dat lijkt verdacht veel op wat ik zoek :) Laat ik daar eens mee gaan expirimenteren :)

  • whoami
  • Registratie: December 2000
  • Laatst online: 20:40
Singleton is mooi, maar je moet het niet gaan misbruiken, en ik denk dat in dit geval een singelton gebruiken, een misbruik is.

Als je class als eerste in frmMain wordt aangeroepen, dan kan je idd je object gaan doorgeven aan je form; maar, dan moet je form wel een property hebben waarmee je dat object weer kunt uitlezen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class ChildForm : Form
{

      private MyClass _myObj;

       public  ChildForm ( MyClass o )
       {
             _myObj = o;
       }

      public MyClass MyObjectItem
      {
            get
             {
                         return _myObj;
             }
      }

}


Echter, wat is de bedoeling van dat 'object'.

[ Voor 4% gewijzigd door whoami op 16-03-2005 14:47 ]

https://fgheysels.github.io/


Verwijderd

Wat kan je met patroon "Observer" ? Dit is gebruikt om bv in Excel van 1 tabel meer dan 1 type grafiekje te kunnen maken. Hiermee kan je er ook voor zorgen dat wanneer je een staafje in een staafplotje oprekt de taartpunten in een bijhorend circeldiagram upgedate worden.

  • whoami
  • Registratie: December 2000
  • Laatst online: 20:40
Ik denk niet dat een observer hier het probleem kan oplossen; echter, er is weinig geweten over het specifieke probleem van de TS.

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op woensdag 16 maart 2005 @ 16:23:
echter, er is weinig geweten over het specifieke probleem van de TS.
Wat bedoel je? Te weinig info over de vraag?

Het probleem is simpelweg dat ik 1 class heb, waarvan ik 1 instance wil die ik in elk form kan gebruiken, in plaats van in elk form een nieuwe instance van de class.

Ik ben aan het spelen met Singleton nu, maar nog geen resultaat daarmee. Volgens mij moet het ook veel simpeler kunnen..

  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 16:41

Nick_S

++?????++ Out of Cheese Error

Je wilt dus je data scheiden van je view.

Misschien is dan het MVC pattern iets voor je? (Model View Controller)

Als je echt puur die ene instantie in verschillende forms wilt, zul je hem mee moeten geven met de constructor van die forms (of met een set-operatie moeten meegeven)

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


Verwijderd

Topicstarter
Je wilt dus je data scheiden van je view.
Min of meer..

Het wordt een class waarin ik alle user-gerelateerde zaken wil bewaren. Mijn App is een MDI form, waarin op elk moment de login gewijzigd kan worden, dus inloggen als een andere user. Daarvoor wil ik wat functies en data in die class zetten. Zodra een login succesvol is, de rechten van de user, settings, etc, vastleggen in die class, en die wil ik dus weer in de functies van die class uitlezen/schrijven.
Misschien is dan het MVC pattern iets voor je? (Model View Controller)
Thanks, maar eens uitgooglen wat dat inhoud.

[ Voor 7% gewijzigd door Verwijderd op 16-03-2005 18:28 ]


  • riezebosch
  • Registratie: Oktober 2001
  • Nu online
Het meegeven in de constructor is al een goed idee (zoals ik in de tweede reply al opperde ;) ) en als je wat wilt wijzigen zodat het direct overal gewijzigd is moet je het object als ref meegeven (vergelijkbaar met een pointer in C++).

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • Mischa_NL
  • Registratie: Mei 2004
  • Laatst online: 01-02-2023
je kunt toch gewoon in de class
C#:
1
public mytype myvar

neerzetten?

Zo zeg maar:

C#:
1
2
3
4
5
6
7
8
namespace mynamespance
{
    public class Snake_1
    {
        public string mystring = "lala";
    }

}


deze is vanuit al je functies aan te roepen binnen de class.

Verwijderd

Topicstarter
Mischa_NL schreef op woensdag 16 maart 2005 @ 18:57:
je kunt toch gewoon in de class
C#:
1
public mytype myvar

neerzetten?

Zo zeg maar:

C#:
1
2
3
4
5
6
7
8
namespace mynamespance
{
    public class Snake_1
    {
        public string mystring = "lala";
    }

}


deze is vanuit al je functies aan te roepen binnen de class.
Ja, zo heb ik het ook.. maar wanneer je in een form de class aanroept, wordt er een nieuwe instance van de class gemaakt. Dus met eigen public string's etc. Dat is juist het probleem :)

Ik zoek juist naar de mogelijkheid om alle forms dezelfde instance te laten gebruiken.
Het meegeven in de constructor is al een goed idee (zoals ik in de tweede reply al opperde ) en als je wat wilt wijzigen zodat het direct overal gewijzigd is moet je het object als ref meegeven (vergelijkbaar met een pointer in C++).
Heb je daar mischien een voorbeeldje of linkje van?

[ Voor 29% gewijzigd door Verwijderd op 16-03-2005 19:24 ]


  • riezebosch
  • Registratie: Oktober 2001
  • Nu online
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
public class MyClass
{
}

public class ChildForm : Form
{
   private MyClass _myObj;

   public  ChildForm ( ref MyClass o )
   {
      _myObj = o;
   }
}

public class MainForm : Form
{
   private MyClass  _myObj;

   private ChildForm _myChild1;
   private ChildForm _myChild2;

   public  MainForm ( )
   {
      _myObj = new MyClass();

      _myChild1 = new ChildForm( ref _myObj );
      _myChild2 = new ChildForm( ref _myObj );
   }
}


edit:

Niet getest...

[ Voor 10% gewijzigd door riezebosch op 16-03-2005 19:57 ]

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


Verwijderd

Topicstarter
Yess! Dat is het!

Super! _/-\o_

  • riezebosch
  • Registratie: Oktober 2001
  • Nu online
Let wel dat dit minder veilig programmeren is. Misschien moet je nog maar is kijken of het MVC-pattern niet beter van toepassing is. Want omdat je met references gaat werken wordt het voor jezelf onduidelijk wie nou wanneer je object aanpast.

Moet zelf ook nog is een keer alle patterns doornemen :P Heb wel het GoF-boek vast aangeschaft.

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • riezebosch
  • Registratie: Oktober 2001
  • Nu online
Nu heb ik zelf nog een vraag:
Maakt het nog verschil of je parameters 'gewoon' of als 'ref' doorgeeft? In principe wordt alles (wat op de heap staat) toch by-reference doorgegeven!? Dan zou het alleen verschil maken bij de simpele datatypes (en structs)...

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • whoami
  • Registratie: December 2000
  • Laatst online: 20:40
A value-type variable contains its data directly as opposed to a reference-type variable, which contains a reference to its data. Therefore, passing a value-type variable to a method means passing a copy of the variable to the method. Any changes to the parameter that take place inside the method have no affect on the original data stored in the variable. If you want the called method to change the value of the parameter, you have to pass it by reference, using the ref or out keyword. For simplicity, the following examples use ref.
A variable of a reference type does not contain its data directly; it contains a reference to its data. When you pass a reference-type parameter by value, it is possible to change the data pointed to by the reference, such as the value of a class member. However, you cannot change the value of the reference itself; that is, you cannot use the same reference to allocate memory for a new class and have it persist outside the block. To do that, pass the parameter using the ref (or out) keyword. For simplicity, the following examples use ref.

https://fgheysels.github.io/


  • FTL
  • Registratie: Maart 2000
  • Laatst online: 08:55

FTL

riezebosch schreef op donderdag 24 maart 2005 @ 15:14:
Nu heb ik zelf nog een vraag:
Maakt het nog verschil of je parameters 'gewoon' of als 'ref' doorgeeft? In principe wordt alles (wat op de heap staat) toch by-reference doorgegeven!? Dan zou het alleen verschil maken bij de simpele datatypes (en structs)...
Bij reference types hoef je niet ref aan te geven.
Strings en Objecten zijn reference types, dus een ref is niet nodig. Deze staan op de heap.
(en alle user defined types op structs na). Alle value types staan op de stack.

[ Voor 13% gewijzigd door FTL op 25-03-2005 10:47 ]


  • riezebosch
  • Registratie: Oktober 2001
  • Nu online
Gelukkig :) Was dus precies wat ik dacht.
Had ook een testje gedaan met 2 functies aanroepen met dezelfde parameter, de één by-ref en de ander by-value. In die functie de parameter muteren en vervolgens in de aanroepende functie controleren of de mutaties inderdaad ook op het object zelf of een copy uitgevoerd waren. Hieruit bleek ook al dat voor de non-integral datatypes het niet nodig is ze expliciet als 'ref' door te geven :)

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack

Pagina: 1