Archief - [C#] Eigenschap met MessageBox

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

jimowns

Legacy Member
Ik heb eigenlijk 1 pracktische vraag en 1 theoretisch vraagje.

1) Ik wil eigenlijk in een eigenschap een controle laten uitvoeren, zodat ik op de button druk dat er op komt in een messagebox dat ik maar "1x" op de knop gedrukt heb en als ik nog eens erop druk dat er "2x op knop gedrukt" tevoorschijn komt.

Ik krijg wel een MessageBox berichtje maar het telt niet op.

2) Een eigenschap dient dat alleen maar voor controle uit te voeren ? Want ik heb het boek Visual C# 2008 - de Basis maar het staat er allemaal niet echt duidelijk in.

Code:
        //  Een eigenschap is voor controle uit te voeren: 
        public string Controle = (0).ToString();
        public string Controle01
        {
            set
            {
                int Contr = Int32.Parse( Controle );  // Omzetten van string naar integer 32 bits
                for (Contr = 0; Contr < 10; Contr++)
                {
                    MessageBox.Show(Contr.ToString());
                }
            }
            get
            {
                return Controle;
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Je hebt: " + Controle01 + " keer gedrukt op de knop");
        }


Mvg, Jim ;)

Fraggie

Legacy Member
Om op je tweede vraag te antwoorden:

Een property is zoals je de get..() en set..() methoden hebt in Java. Op zich lijken die get..() en set.() handig, maar het is geen eigenschap van je taal, het is de verantwoordelijkheid van de programmeur om hem aan bepaalde conventies te houden.

De bedoeling van de get..() en set..() methoden zijn dat je vaste methoden hebt die variabele variabelen (:D) onderhoudt. Alla het systeem van C/C++ met .h(pp) en .c(pp) bestanden heeft.

In C# kan je heel handig één property aanmaken die zowel de get..() als de set..() kan vervangen. Het verbeterd het overzicht in code (get en set staan samen) en het kan het typen van code versnellen.

Indien je aan totaal programmeren doet en je altijd een geldige waarde wil voor een bepaalde variabele kan je inderdaad controle statements steken in de set van je prop. Dat is geen vereiste.

Krueger

Legacy Member
Voor je eerste vraag:
volgende vind ik zeer raar:' public string Controle = (0).ToString();' Waarom schrijf je dat zo, ik moet zeggen dat ik dat nog nooit gezien heb.

En waarom het niet optelt is eigenlijk wel logisch. Je print in je msgbox de waarde van Controle01 af . Dit is een getter op de controle variabele. Maar deze waarde van controle verhoog je nergens, dus zal ook de waarde die je afprint niet verhogen.

NeverwinterX

Legacy Member
Zeer vreemde code heb je daar.
Waarom hou je het aantal keer dat op de knop gedrukt wordt bij met een string? Het is veel logischer om dat met een integer bij te houden en het om te zetten naar een string wanneer je het displayed. Je verhoogt de variabele ook niet aangezien je de set niet gebruikt? En dan de manier waarop je de variabele set is bizar: je print de variabele gewoon 10x? edit: nee, want je wijzigt zelfs de variabele die je uitleest, je print gewoon de getallen van 0 tot 9

Bekijk eens grondig wat je doet. Dit kan daarbij helpen: Using Properties (C#)

Dastardly

Legacy Member
Code:
        private int controle = 0;

        public int Controle 
        {
           get { return controle; }
           set { controle = value; }
         }

        private void button1_Click(object sender, EventArgs e)
        {
            controle++;
            MessageBox.Show("Je hebt: " + controle.ToString() + " keer gedrukt op de knop");
        }

het lijkt mij redelijk overbodig om met al die conversies te werken. waarom zou je van een int waarde een string maken als je weet dat je enkel gaat werken met de variabele als een int en niet als een string ?

misschien ook handig om meteen een duidelijk verschil te maken tussen verschillende soorten variabelen ? Ik probeer diegene die ook buiten die klasse (of wat dan ook) te gebruiken zijn te beginnen met een hoofdletter en de interne met een kleine letter.

een goede tip voor later (ik wist het een tijdje terug in ieder geval niet). probeer op andere manieren te testen dan met een Messagebox.Show. ik deed het vroeger ook zo en uit gewoonte ben ik zo verder blijven doen. helaas loopt er redelijk wat mis als je dit gaat doen bij bijvoorbeeld een live website ;) (is maar een voorbeeldje, maar daar komt die messagebox dus op je server, en niet bij de client waardoor alles hangt tot iemand op de server op ok klikt). gebruik een label of iets dergelijks, werkt even goed.

jimowns

Legacy Member
Het wordt allemaal ingewikkelder.
Maar ik begin het beter op te vatten ;) .
Dus zover ik nu al weet is:
- Eigenschappen zijn geen variabele.
- De get is erom voor te zorgen de waarde terug te geven aan het veld.
- De set spoort eigenlijk de waarde op van het veld.
- De eigenschap kan in elk andere functie gebruikt worden zolong het binnen de classe blijft. Maar de waarde dat in het veld zit kun je niet veranderen.

klopt mijn redenering of moet er nog iets aan toegevoegd worden.



Sorry voor de last dat ik een beetje zorg.
Mvg, Jim

NeverwinterX

Legacy Member
jimowns zei:
- De set spoort eigenlijk de waarde op van het veld.
- De eigenschap kan in elk andere functie gebruikt worden zolong het binnen de classe blijft. Maar de waarde dat in het veld zit kun je niet veranderen.

Nee, met de set kun je de waarde van het veld veranderen.
Eigenschappen kun je ook buiten de klasse gebruiken als ze public zijn.
Bekijk de website die ik je gaf: http://msdn.microsoft.com/en-us/library/w86s7x04(VS.80).aspx

jimowns

Legacy Member
NeverwinterX zei:
Nee, met de set kun je de waarde van het veld veranderen.
Eigenschappen kun je ook buiten de klasse gebruiken als ze public zijn.
Bekijk de website die ik je gaf: Using Properties (C#)
Ik had het van die site begrepen, mijn engels is niet echt goed, ik ga nog eens goed overlezen en nog overlezen. Tot ik het volledig onder de knie heb.

Fraggie

Legacy Member
jimowns zei:
Ik had het van die site begrepen, mijn engels is niet echt goed, ik ga nog eens goed overlezen en nog overlezen. Tot ik het volledig onder de knie heb.
Je zal uiteindelijk wel zien dat je er meer achter zoekt dan er in werkelijkheid is. Misschien is het daarom ook beter om in het begin met "volledige" properties te werken (dus met backing variable).

Vergeet ook die Nederlandstalige namen die je momenteel gebruikt dat maakt het misschien zo ingewikkeld :p. Het is belangrijk da je weet waarom bepaalde vakjargon gebruikt wordt. Zo zegt en veld evenveel als een field maar minder als een attribute wat op zijn beurt meer zegt dan een variabel.

jimowns

Legacy Member
Ja je hebt wel gelijk, ik probeer alleen maar hier en daar wat te testen en dat ik zo het beter kan verstaan, ik heb nu een oefening gedaan met eigenschappen en het werkt correct. wanneer je 300 seconde ingeeft, geeft het dit weer: 5min.
maar ik wil mijn iteratie in de set() van Property's steken en dan werkt deze niet meer. Het is allemaal nog niet echt duidelijk maar na deze commentaren begin ik toch wat beter na te denken :p .
Ja die nederlandstalige namen :p ik zal het in engels doen :D

Moto

Legacy Member
wanneer je 300 seconde ingeeft, geeft het dit weer: 5min
Ik ook!

Code:
   public partial class Form2 : Form
   {
      public Form2()
      {
         InitializeComponent();

         Func<TextBox, int> GetIntFromTextBox = txtb =>  
                                       {
                                          int tmp;
                                          return (Int32.TryParse(txtb.Text, out tmp)) ? tmp : 0;
                                       };

         Func<int, double> ConvertSecondsToMinutes = seconds => new TimeSpan(0, 0, seconds).TotalMinutes;

         btnGo.Click += (s, e) => txtOut.Text = string.Format("{0} min", ConvertSecondsToMinutes(GetIntFromTextBox(txtIn)));
      }
   }

jimowns

Legacy Member
Maar ik heb dat gedaan in property's zodanig ik dat beter begrijp.
Maar kun je in een property van set een iteratie plaatsen en dat het ook uitvoerd ? want dat heb ik ook geprobeert en lukte niet.

cG`

Legacy Member
No offence Moto, maar als je een beginner wil helpen, post dan misschien ietwat leesbare code (en ik zou al zeker geen lambda expressions gaan gebruiken).. Just my 2 cents

jimowns

Legacy Member
Hier is de code:
Maar als ik de iteratie-instructie in de set wil plaatsen van property's dan werkt deze niet meer.
Code:
    class Tijd
    {
        public int _Seconde;   // Veld van _Seconde
        public int _Minuten;
        public int _Uren;
        public int Seconde
        {
            get { return _Seconde; }  // Geeft de waarde terug naar het veld van _Seconde;
            set
            {
                _Seconde = value;     // Achterhaald de waarde van _Seconde van de 'Field'
            }
        }
        public int Minuten
        {
            get { return _Minuten; }
            set 
            { 
                _Minuten = value; 
            }
        }
        public int Uren
        {
            get { return _Uren; }
            set 
            { 
                _Uren = value; 
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Tijd T = new Tijd();  // Declareerd het object met een nieuwe variabele
            T._Seconde = 60;      // 60 seconde is 1 minuut
            T._Minuten = 60;      // 60 minuten is 1 uur
            T._Uren = 1;          // 1 uur is 1 uur

            // De Iteratie Do-While instructie
            // Voor meerdere malen te doorlopen. 
            do
            {
                T._Seconde = T._Seconde - 60;
                T._Minuten = T._Minuten + 1;
            }
            while (T._Seconde >= 60);

            do
            {
                T._Minuten = T._Minuten - 60;
                T._Uren = T._Uren + 1;
            }
            while (T._Minuten >= 60);

            // De output van de tijd.
            Console.WriteLine("Seconde: " + T.Seconde);
            Console.WriteLine("Minuten: " + T.Minuten);
            Console.WriteLine("Uren : " + T.Uren);
        }
    }

NeverwinterX

Legacy Member
jimowns zei:
Hier is de code:
Maar als ik de iteratie-instructie in de set wil plaatsen van property's dan werkt deze niet meer.
Code:
    class Tijd
    {
        public int _Seconde;   // Veld van _Seconde
        public int _Minuten;
        public int _Uren;
        public int Seconde
        {
            get { return _Seconde; }  // Geeft de waarde terug naar het veld van _Seconde;
            set
            {
                _Seconde = value;     // Achterhaald de waarde van _Seconde van de 'Field'
            }
        }
        public int Minuten
        {
            get { return _Minuten; }
            set 
            { 
                _Minuten = value; 
            }
        }
        public int Uren
        {
            get { return _Uren; }
            set 
            { 
                _Uren = value; 
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Tijd T = new Tijd();  // Declareerd het object met een nieuwe variabele
            T._Seconde = 60;      // 60 seconde is 1 minuut
            T._Minuten = 60;      // 60 minuten is 1 uur
            T._Uren = 1;          // 1 uur is 1 uur

            // De Iteratie Do-While instructie
            // Voor meerdere malen te doorlopen. 
            do
            {
                T._Seconde = T._Seconde - 60;
                T._Minuten = T._Minuten + 1;
            }
            while (T._Seconde >= 60);

            do
            {
                T._Minuten = T._Minuten - 60;
                T._Uren = T._Uren + 1;
            }
            while (T._Minuten >= 60);

            // De output van de tijd.
            Console.WriteLine("Seconde: " + T.Seconde);
            Console.WriteLine("Minuten: " + T.Minuten);
            Console.WriteLine("Uren : " + T.Uren);
        }
    }

Dat kan best werken, hangt ervan af hoe je die iteratie precies in de set hebt gestoken. Toon dat eens.

Verder wat opmerkingen:
  • Gebruik kleine letter voor een gewone locale variabele: dus maak van die T een t of liefst iets duidelijker zelfs.
  • Gebruik een while in plaats van een do-while anders zal je op een negatief getal uitkomen als seconden bijvoorbeeld gelijk is aan 3.

Krueger

Legacy Member
Ik denk wel dat je het een en ander over het hoofd hebt gezien NeverwinterX, want die code slaat op niet veel.

Je maakt je fields public, terwijl je ze eigenlijk private wil hebben, dus
private int _Seconde; ipv public int _Seconde;

Dan zorg je er voor dat je in je Main code je enkel nog aan de public properties kan, wat ook de bedoeling is. Dus dan krijg je vb:
T.Seconde = 60; ipv T._Seconde = 60;
En dan kom je wel in je getters en setters terecht, want die omzeil je nu altijd.

En tenslotte nog dit, maar misschien heb je het bewust gedaan, ipv een structuur te gebruiken van:

private int a;
public int A
{get { return a;}
set{ a = value;}
}
is het mooier dat je schrijft:
public int A {get;set;} Met de voorwaarde dan uiteraard dat er geen extra code in je get en set komt.

jimowns

Legacy Member
@Krueger Sorry dat was een heel verstandloze fout dat ik gemaakt heb. Van de Field, public te creeren.
Deze fout heb ik zelf nog niet eens met het oog op gezien.
Maar de veldnamen en de propertynamen, heb ik die stuctuur bewust gekozen omdat het gemakkelijker is voor mezelf.

NeverwinterX

Legacy Member
Krueger zei:
Ik denk wel dat je het een en ander over het hoofd hebt gezien NeverwinterX, want die code slaat op niet veel.
Dus dan krijg je vb:
T.Seconde = 60; ipv T._Seconde = 60;
En dan kom je wel in je getters en setters terecht, want die omzeil je nu altijd.

Dat had ik gezien, ik dacht dat hij die omzetting nu aan het proberen was en dat dat niet lukte. Daarom dat ik daarnaar vroeg.

Misschien is het nuttig jimowns om te weten wat er nu eigenlijk achter de schermen gebeurt met die properties, want ik heb de indruk dat je dat niet echt snapt.
Klassiek maak je in Java en andere programmeertalen waar geen properties bestaan de volgende getter en setter methodes:

Code:
public class Account {
	private int amountOfSomething;

	public int GetAmountOfSomething() {
		return this.amountOfSomething;
	}

	public void SetAmountOfSomething(int amountOfSomething) {
		this.amountOfSomething = amountOfSomething;
	}
}
Je schermt het attribuut amountOfSomething af en je laat enkel toegang daarop toe via de getters en setters. Zodanig dat als later blijkt dat het nodig is om validatie te doen of intern de manier van opslagen van het attribuut te veranderen, dat je dit gewoon in de getters en setters kan doen en dat je niet overal dat attribuut moet vervangen als je dit rechtstreeks gebruikt zou hebben.

Properties maken dit iets gemakkelijker en dan kan je dit schrijven in plaats van die getter en setter methodes:
Code:
public class Account {
	private int amountOfSomething;

	public int AmountOfSomething {
		get{ return amountOfSomething; }
                set{ amountOfSomething = value; }
	}
}
Dit is dus ten eerste een andere (en kortere) versie van de klassieke getter en setter. Merk op dat "value" een soort van impliciete parameter is, die je niet expliciet hoeft te declareren in de parameters ofzo (het is eigenlijk hetzelfde als de amountOfSomething parameter in de SetAmountOfSomething hierboven).
Ten tweede is het niet alleen een kortere versie, maar het gaat ook oproepen of toekenningen aan AmountOfSomething on the fly herleiden naar die getters en setters om zo amountOfSomething op te roepen of aan te passen.

Bijvoorbeeld als je dit doet:
Code:
Account myAccount = new Account();
System.Console.WriteLine("Blabla: " + myAccount.AmountOfSomething);
dan zal dit automatisch die "get{ return amountOfSomething; }" gebruiken om aan die amountOfSomething van die account te geraken.
Als je van die getter in de plaats dit maakt: "get{ return amountOfSomething + 1; }" dan zal myAccount.AmountOfSomething de waarde van amountOfSomething + 1 teruggeven (maar amountOfSomething niet aanpassen).

Analoog met de setter:
Code:
Account myAccount = new Account();
myAccount.AmountOfSomething = 20;
dan zal dit automatisch die "set{ amountOfSomething = value; }" gebruiken om die amountOfSomething aan te passen en value zal hier dan 20 zijn en dus amountOfSomething zal 20 gemaakt worden.
Als je van die getter in de plaats dit maakt: "set{ amountOfSomething = value + 10; }" dan zal myAccount.AmountOfSomething = 40; dus van amountOfSomething 50 maken (40 + 10).
Edit: Merk dus op het verschil met het rechtstreeks aanpassen van het attribuut ipv de property: myAccount.amountOfSomething = 40; (gesteld dat amountOfSomething public is) zal niet via die set gaan en amountOfSomething zal 40 worden.


En dan heb je ook nog wat Krueger zei, als je niet speciaals doet in die properties dan kan je het nog korter schrijven als
Code:
public class Account {
	private int amountOfSomething;

	public int AmountOfSomething {
		get; set;
	}
}
Dat is hetzelfde als mijn 2de codevoorbeeld. Let wel op: als je dan de getter of setter wilt aanpassen om validatie ofzo te doen dan zul je het weer voluit moeten schrijven als het 2de codevoorbeeld.

jimowns

Legacy Member
@NeverwinterX
Ik snap het nu volledig :D Echt dankuwel voor al deze informatie over Property's .
nu ik dit gelezen heb, ben ik heel stom geweest hoe ik property's nu niet kon begrijpen.
Dit gaf mij wel een heel duidelijk inzicht over property's en hoe het achter de schermen er aantoe gaat.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan