Toon posts:

[C#] Waar is de "oude" static uit c gebleven?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Vroegah toen men nog in C programmeerde.. (naja een hoop doen het nog steeds! ik ook!) toen kon je het volgende doen:

void functionname ()
{
static int blaat = 0;
blaat++;
printf("blaat= %d", blaat);
}

vervolgens kon je deze functie x keer aanroepen en blaat telde keurig op elke keer dat je hem aanriep... Alleen als ik in C# een private functie heb.. kan ik geen static declareren?? (nu heeft static volgens mij een iets andere betekenis in C# dan in C, ook vanwege ut "managmed"code... ) in C stond je variable gewoon altijd op zelfde plekje in je geheugen... Kan dit ook (of in iedergeval de functionaliteit) in C#? Ik snap dat ut ook werkt met een variable met een breedere scope... maar das niet wenselijk in mijn geval..

  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

Een static binnen een functie bestaat inderdaad niet in C#. BInnen een class echter wel. Als je het volgende doet werkt het hetzelfde:
C#:
1
2
3
4
5
6
7
8
9
public class Test {
    private static int counter = 0;

    public void DoWhatIMean() {
        Test.counter++;

        Console.WriteLine("counter: " + Test.counter);
    }
}

en dan zo aanroepen:
C#:
1
2
3
4
5
6
7
8
9
public class Program {
    public static void Main(string[] args) {
        Test t = new Test();
    
        t.DoWhatIMean(); // Geeft 1
        t.DoWhatIMean(); // Geeft 2
        t.DoWhatIMean(); // Geeft 3
    }
}


Maar ik zou denk ik eerst maar eens een intro cursusje C# gaan doen. Dat scheeltje wat zoekwerk ;)

[ Voor 23% gewijzigd door MTWZZ op 07-03-2007 12:39 ]

Nu met Land Rover Series 3 en Defender 90


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 13:50

Creepy

Tactical Espionage Splatterer

MTWZZ: in het voorbeeld wat je nu geeft hoeft counter helemaal niet static te zijn om hetzelfde resultaat te krijgen aangezien je maar 1 object instantieert. Je hoeft die static pas te gebruiken als je wilt dat counter altijd hetzelfde moet zijn over alle instanties van de klasse Test heen.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Een static variabele is een Klassevariabele, géén object variabele.
Hij zou dus gewoon aan te roepen zijn zonder een instantie van de klasse te hoeven maken.

Java:
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
package org.worteltaart.hro.jtwee.kennisoverdracht;

public class AutoVoorbeeld2 {
    
    // attributen van de klasse
    private String autoColor = "black";
    
    private int aantalAutos = 0;
    private static int exAantalAutos = 0;
    
    
    // default constructor
    public AutoVoorbeeld2() {
        this.autoColor = "black";
        this.setAantalAutos(this.getAantalAutos() + 1);
        this.setExAantalAutos(this.getExAantalAutos() + 1);
    }
    
    // overloaded constructor
    public AutoVoorbeeld2(String nColor) {
        this.autoColor = nColor;
        this.setAantalAutos(this.getAantalAutos() + 1);
        this.setExAantalAutos(this.getExAantalAutos() + 1);
    }
    
    public int getAantalAutos() {
        return aantalAutos;
    }

    public void setAantalAutos(int aantalAutos) {
        this.aantalAutos = aantalAutos;
    }

    public static int getExAantalAutos() {
        return exAantalAutos;
    }

    public static void setExAantalAutos(int aExAantalAutos) {
        exAantalAutos = aExAantalAutos;
    }
}

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package org.worteltaart.hro.jtwee.kennisoverdracht;

public class AutoVoorbeeld2Test {
    
    public static void main(String[] args) {
        
        // instantieer een nieuw object uit de AutoVoorbeeld2
        // door middel van de default constructor
        AutoVoorbeeld2 aVoorbeeld = new AutoVoorbeeld2();
        AutoVoorbeeld2 aVoorbeeld2 = new AutoVoorbeeld2();
        
        
        System.out.println("Aantal objecten (klasse variabele): " + AutoVoorbeeld2.getExAantalAutos());
        
    }
    
}


Hoewel dit java code is lijkt het me ook toepasbaar op c# :)

[ Voor 7% gewijzigd door Verwijderd op 07-03-2007 13:24 ]


  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

Creepy schreef op woensdag 07 maart 2007 @ 13:02:
MTWZZ: in het voorbeeld wat je nu geeft hoeft counter helemaal niet static te zijn om hetzelfde resultaat te krijgen aangezien je maar 1 object instantieert. Je hoeft die static pas te gebruiken als je wilt dat counter altijd hetzelfde moet zijn over alle instanties van de klasse Test heen.
Ja klopt ook weer. Ik zat even niet op te letten.

Nu met Land Rover Series 3 en Defender 90


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 12:50
Verwijderd schreef op woensdag 07 maart 2007 @ 13:21:
Een static variabele is een Klassevariabele, géén object variabele.
Hij zou dus gewoon aan te roepen zijn zonder een instantie van de klasse te hoeven maken.

Java:
1
this.setExAantalAutos(this.getExAantalAutos() + 1);
Een goede IDE waarschuwt je hier dat je een static functie op een niet-static manier gebruikt :Y)

Roomba E5 te koop


Verwijderd

Topicstarter
& worteltaart..

Nja das dus idd weer soort "Global", zit dus nix anders op. Maar goed hij kan ook binnen mn eigen classe gedefinieerd worden. Jammer dat die oude static niet meer bestaat.. In de embedded wereld wordt hij natuurlijk vaak gebruikt! maar goed meeste daarvan wordt ook in C geschreven gelukkig...

Ff een andere vraag, ik heb in mn bestaande communicatie programma een .h file met een vlinke enum:

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
 enum BusVariables
        {
            CH_PARAMS_BEGIN,
            CH_PARAM0 = CH_PARAMS_BEGIN,
            CH_PARAM1,
            CH_PARAM2,
            CH_PARAM3,
            CH_PARAM4,
            CH_PARAM5,
            CH_PARAM6,
            CH_PARAM7,
            CH_PARAM8,
            CH_PARAM9,
            CH_PARAM10,
            CH_PARAM11,
            CH_PARAMS_END = CH_PARAM11,


            HW_PARAMS_BEGIN,
            HW_PARAM0 = HW_PAR
            ********************** (en nog veeeel meer) ************

           PRODUCTION_DATA_BEGIN,
            PRODUCTION_DATA0 = PRODUCTION_DATA_BEGIN,
            PRODUCTION_DATA1,
            PRODUCTION_DATA_END = PRODUCTION_DATA1,

            /* put new members before this line */
            BUSVARSEND,
            BUSVARS = BUSVARSEND    /* end marker */
        };


Hoe kan ik deze nou het makkelijkst gebruiken in mn project... C# heeft immers geen header achtige dingen meer..Let wel dat de waardes hetzelfde moeten blijven... Kan ik nu een externe class maken en deze er in knallen? als ik dat nu doe krijgt bijv PRODUCTION_DATA1 een andere value ((int)PRODUCTION_DATA1);

Verwijderd

sig69 schreef op woensdag 07 maart 2007 @ 13:52:
[...]

Een goede IDE waarschuwt je hier dat je een static functie op een niet-static manier gebruikt :Y)
Woeps :o Gegenereerd door NetBeans :|
Java:
1
 this.setExAantalAutos(this.getExAantalAutos() + 1);

Dan snap ik je trouwens even niet, setExAantalAutos en getExAantalAutos zijn beide static.
Uitleg graag :)

[ Voor 32% gewijzigd door Verwijderd op 07-03-2007 14:17 ]


  • ReverendBizarre
  • Registratie: December 2001
  • Laatst online: 24-03-2021
Ze zijn static, dus hoor je ze ook static te benaderen. Dus AutoVoorbeeld2.setExAantalAutos() en niet this.setExAantalAutos(). In de praktijk werkt het natuurlijk allebei, maar voor de duidelijkheid en leesbaarheid van je code is de eerste notatie beter. Je kan dan aan de aanroep zien dat je met een static methode te maken hebt, bij de tweede methode kan je dit niet.

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

this.setAantalAutos(this.getAantalAutos() + 1);
this.setExAantalAutos(this.getExAantalAutos() + 1);
Die kun je op z'n minst beter vervangen door
aantalAutos++;
exAantalAutos++;

Verwijderd

Mjah, die zijn op die manier gerefactored door NetBeans;
van mijn:
Java:
1
2
aantalAutos++;
exAantalAutos++;

Werd:
Java:
1
2
this.setAantalAutos(this.getAantalAutos() + 1);
this.setExAantalAutos(this.getExAantalAutos() + 1);

gefabriceerd.

[ Voor 66% gewijzigd door Verwijderd op 07-03-2007 16:34 ]

Pagina: 1