n00b pro

07. Static en enum

Dit hoofdstuk is onderdeel van de cursus C#. Andere cursussen in dezelfde reeks: HTML, CSS, Javascript, Ontwikkelomgeving.

Youtube: static en enum

https://www.youtube.com/watch?v=E41fnuHngt4

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;
      }
   }
}

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();
      }
   }
}
Dinsdag
Zaterdag
5
Woensdag
resultaat in de console