public int radius;
Circle circle = new Circle();
circle.radius = -5;
MessageBox.Show(String.Format(
"Cirkel met straal {0} en omtrek {1}",
circle.radius.ToString(),
Math.Round(circle.Circumference(),2).ToString()));
Je krijgt geen compiletime noch runtime fout. We hebben radius gedeclareerd als int, het is binnen de context van een geheel getal volstrekt legaal om te werken met negatieve getallen.
We weten echter dat een cirkel geen negatieve straal kan hebben, we kunnen dit niet toestaan!
public partial class Circle
{
private int radius;
public void SetRadius(int r)
{
if (r > 0) radius = r;
else radius = 0;
}
...
Wanneer de opgegeven radius kleiner is dan 0, stellen we die in op 0
Je zou natuurlijk ook Exception kunnen opwerpen.
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
Circle circle = new Circle();
circle.SetRadius(-5);
MessageBox.Show(String.Format(
"Cirkel met straal {0} en omtrek {1}",
circle.radius.ToString(),
Math.Round(circle.Circumference(),2).ToString()));
}
}
De tweede aangeduide lijn resulteert echter nog steeds in een compileerfout.
Daar radius private is kunnen we die nu ook niet meer opvragen!
public int GetRadius() { return radius; }
Circle circle = new Circle();
circle.SetRadius(-5);
MessageBox.Show(String.Format(
"Cirkel met straal {0} en omtrek {1}",
circle.GetRadius().ToString(),
Math.Round(circle.Circumference(),2).ToString()));
Zo merk je dat bij een negatieve radius deze door ons programma op 0 wordt ingesteld.
Conclusie:
circle.radius
circle.GetRadius()
circle.radius = -5;
circle.SetRadius(-5);
Een ideale oplossing voor dit probleem vormen properties of eigenschappen: je hebt de afscherming zoals met methoden, maar naar de buitenwereld toe kan je de data manipuleren zoals een field.
public int Radius
{
get { return radius; }
set
{
if (value > 0) radius = value;
else radius = 0;
}
}
Het onderdeel get geeft aan wat er gebeurt wanneer de property wordt gelezen.
Laat je dit onderdeel weg, dan kan de eigenschap niet uitgelezen worden, de property is Write-only
Het onderdeel set geeft aan hoe de eigenschap wordt weggeschreven.
In dit onderdeel kan je gebruik maken van het sleutelwoord value om te verwijzen naar de waarde waarop de property ingesteld wordt.
Laat je dit onderdeel weg, dan kan de eigenschap niet gebruikt worden om een waarde te veranderen, de property is Read-only
De naam van een field begint meestal met een kleine letter, die van properties met een hoofdletter.
Opgepast, het field radius is hier nog steed nodig, de property Radius gaat dit field enkel afschermen tegen oneigenlijk gebruik.
private int waarde;
public int Waarde
{
get { return waarde; }
set { waarde = value; }
}
public int Waarde { get; set; }
| Meer tutorials: |
| leer ook: | html | | xhtml | | css | | asp | | asp.net | | c# | | ado.net | | linq | | ajax | | java | | javascript |