Youtube: static en enum
Static
Static members
Een static member of class member (variabele, property of methode) behoort toe aan de hele klasse, niet aan één specifiek object. Je kan ze zien als gemeenschappelijk voor alle objecten. Je hebt er al heel wat gebruikt. Je herkent ze doordat ze opgeroepen worden vanop de class naam:
int int1 = Convert.ToInt32(str1); // statische methode ToInt32() van de klasse Convert
Console.WriteLine("hello"); // statische methode WriteLine() van de klasse Console
timer.Interval = TimeSpan.FromMilliseconds(200); // statische methode FromMilliseconds() van de klasse TimeSpan
string[] files = Directory.GetFiles(startfolder, "*.txt"); // statische methode GetFiles() van de klasse Directory
string tekst = String.Join(Environment.NewLine, lines); // statische methode Join() van de klasse String en statische property NewLine van de klasse Environment
tip: class namen herken je in Visual Studio aan de blauwgroene kleur, zoals Console
, Directory
, Button
enz...
static property
Een voorbeeld van een statische property in Customer
:
class Customer {
...
// voeg static property toe (houdt aantal gecreëerde Customers bij)
public static int NumCustomersCreated { get; set; } = 0;
public Customer() {
...
NumCustomersCreated++;
}
}
static variabele, static methode
Een voorbeeld van een statische methode en private static variabele in Account
:
class Account {
...
// voeg statische variabele toe
private static string rexAccount = @"^\d\d\d-\d\d\d\d\d\d\d-\d\d$";
// voeg statische methode toe
public static bool IsValidAccountNumber(string nr) {
return Regex.Match(nr, rexAccount).Success;
}
}
Ze worden opgeroepen vanop de class Customer
en Account
:
static constante
Aangezien constanten overal dezelfde waarde hebben, zijn ze per definitie static en moeten ze opgeroepen worden vanaf de klasse:
public class Koffer {
public const int MaxGewichtKg = 25;
public const decimal PrijsPerExtraKg = 20;
public int Gewicht { get; set; }
public decimal Overgewicht {
get { return Math.Max(Gewicht - MaxGewichtKg, 0); }
}
public decimal Bijbetalen {
get { return PrijsPerExtraKg * Overgewicht; }
}
public Koffer(int gew) { Gewicht = gew; }
}
let op de conventie: voor constanten gebruik je net zoals bij properties PascalCase notatie, dus MaxGewichtKg
en niet maxGewichtKg
Aangezien constanten altijd static zijn, worden ze dus opgeroepen vanop de klasse:
Console.WriteLine($"Een koffer mag maximaal {Koffer.MaxGewichtKg}kg wegen.");
Console.WriteLine($"Per extra kg betaal je €{Koffer.PrijsPerExtraKg}.");
Koffer koffer1 = new Koffer(27);
if (koffer1.Overgewicht > 0) Console.WriteLine($"Te betalen: {koffer1.Bijbetalen}");
Static classes
Je kan ook een static class declareren. Het mag dan alleen static members bevatten. Gekende voorbeelden zijn de Math
of Environment
klassen. Je zou bv. een eigen klasse kunnen maken met validatie methoden:
// static class: bevat alleen static members
static class Validator {
private static string rexAccount = @"^\d{3}-\d{7}-\d{2}$";
private static string rexEmail = @"^.+\@.+\..+$";
public static bool IsValidAccountNumber(string nr) {
return Regex.Match(nr, rexAccount).Success;
}
public static bool IsValidEmail(string email) {
return Regex.Match(email, rexEmail).Success;
}
public static bool IsValidName(string name) {
return name.Length < 50;
}
}
Static of niet?
Je zou vorig voorbeeld ook kunnen implementeren als een instance property i.p.v. met een statische methode:
class Customer {
...
public bool HasValidEmail {
get {
return Regex.Match(email, @"^.+\@.+\..+$").Success;
}
}
}
- over het algemeen krijgen object methodes & properties de voorkeur: je gebruikt best zo weinig mogelijk static members!
Enum
Een enum is een nieuw gegevenstype bestaande uit een vaste set waarden. Omdat je het type vaak op verschillende plaatsen in je project wil gebruiken, definieer je enums best buiten de class, rechtstreeks in de namespace:
Enums worden intern opgeslagen als gehele getallen, dus je kan makkelijk omzetten naar int
en omgekeerd:
namespace EnumDemoConsole {
// Maandag=0, Dinsdag=1, ..., Zondag=6
public enum Weekdag { Maandag, Dinsdag, Woensdag, Donderdag, Vrijdag, Zaterdag, Zondag }
class Program {
static void Main(string[] args) {
Weekdag dag1 = Weekdag.Dinsdag;
Console.WriteLine(dag1);
Weekdag dag2 = dag1 + 4; // geheel getal bijtellen
Console.WriteLine(dag2);
int dagnr = (int)dag2; // omzetten Weekdag naar int
Console.WriteLine(dagnr);
Weekdag dag3 = (Weekdag)2; // omzetten int naar Weekdag
Console.WriteLine(dag3);
Console.ReadKey();
}
}
}