Gegevenstypes in C# – type bepalen

  1. Inleiding
  2. Willem Tell
  3. Landsknecht
  4. Landvoogd
  5. is
  6. GetType / typeOf
  7. as
  8. cast
  9. Slot
  10. Voorbeeldprogramma

Inleiding

Hoe komen we erachter wat het gegevenstype is van iets ? In C# kun je een aantal operatoren ervoor gebruiken (Is, As, GetType en TypeOf). Mijn uitleg zal ik illustreren aan de hand van de legende van Willem Tell om het geheel enigszins verteerbaar voor je te doen maken.

up | down

Willem Tell

Stel dat wij een regio moeten besturen. Een mooi gebied met mooie bergen, schone meren en lekkere kaas. Een idyllisch gebied met één nadeel. Het wordt bewoond door mensen die ons niet kunnen luchten of zien en die niet willen snappen wat voor een voorrecht het is om deel uit te maken van ons bestuursgebied. Kortom, een zeer ondankbare taak, maar gelukkig hebben we de nodige bestuursinstrumenten om de regio te besturen en ons C# programma is zo’n bestuursinstrument. We definiëren in ons C# programma de “dingen” die van belang zijn in de desbetreffende regio.

up | down

Landsknecht

In de desbetreffende regio woont Willem Tell. Willem Tell is een landsknecht* en een bekende van ons. We zijn hem namelijk al eerder tegengekomen als tegenstander tijdens de slag bij Morgarten in 1315. Aan de slag bij Morgarten worden we liever niet herinnerd. De afloop en de gevolgen van die slag waren niet zo prettig voor ons. We zijn echter niet haatdragend en we zien in Willem Tell een goede aanwinst voor het besturen van de regio. We definiëren in ons C# programma de landsknecht:

class Landsknecht
{
  public string Naam { get; set; }
}

// object
Landsknecht landsknecht = new Landsknecht();
landsknecht.Naam = "Willem Tell";

*(Zwitserse) Landsknecht: dienstplichtige Zwitserse mannen uit verschillende kantons , 14e-16e eeuw , meestal werkzaam in de landbouw waardoor ze maar voor korte tijd de wapens op konden nemen.

up | down

Landvoogd

We gaan ook een landvoogd benoemen die orde op zaken gaat stellen in de regio. Hermann Gessler is, gezien zijn (brute) staat van dienst de persoon om de klus te klaren:

class Landvoogd : Landsknecht
{
  public string Kanton { get; set; }
}

// object
Landsvoogd landvoogd = new Landsvoogd();
landsvoogd.Naam = "Hermann Gessler";
landsvoogd.Kanton = "Uri";


Na verloop van tijd komen we erachter dat Willem Tell niet zo gecharmeerd is van onze aanwezigheid. We besluiten dan ook Willem Tell om te kopen door hem te benoemen tot landvoogd. Gessler bakt er als landvoogd niet veel van en die promoveren we wel weg.

up | down

is

We sturen een aantal van onze hoogwaardigheidsbekleders naar Willem Tell met het aanbod om landvoogd te worden. Onze hoogwaardigheidsbekleders komen echter terug met een bedankbriefje van Willem Tell waarin hij ons aanbod afslaat. Willem Tell is geen landvoogd geworden en dat brengen we als volgt tot uiting in ons C#-programma:

// Is-operator
if (!(landsknecht is Landvoogd))
{
  // de hoogwaardigheidsbekleders 
  // komen onverrichterzake terug
  Console.WriteLine(landsknecht.Naam + 
  " is geen landvoogd.");
}

We gebruiken de is-operator en de operator geeft de waarde false.

up | down

GetType / typeOf

We doen een hernieuwd bod en we sturen opnieuw een aantal hoogwaardigheidsbekleders om het bod over te brengen. Deze keer zijn de hoogwaardigheidsbekleders wat gespierder qua fysiek en ze hebben de bevoegdheid om indien nodig wat directer te zijn als dat nodig mocht zijn om Willem Tell te kunnen overtuigen.

Helaas mislukt ook deze poging. De hoogwaardigheidsbekleders komen besmeurd met pek en veren terug met wederom een bedankbrief van Willem Tell waarin hij ons aanbod afslaat. We brengen het falen als volgt tot uiting in ons C#-programma:

if (landsknecht.GetType() != typeof(Landvoogd))
{
  // de hoogwaardigheidsbekleders komen
  // besmeurd met pek en veren terug
  Console.WriteLine(landsknecht.Naam + 
  " is nog steeds geen landvoogd." + 
  Environment.NewLine);
}

De GetType en de typeOf-operatoren retourneren de gegevenstype van het te onderzoeken object en in dit geval wordt gegevenstype Landsknecht geretourneerd en niet gegevenstype Landvoogd, de gegevenstype waarop we hadden gehoopt.

up | down

as

We sturen een speciale werkgroep met speciale tools en de werkgroep mag haar tools naar eigen inzicht toepassen om Willem Tell over te halen op ons aanbod in te gaan. Helaas mislukt ook deze poging want de leden van de werkgroep zijn opeens spoorloos verdwenen. We krijgen van Willem Tell wel een brief waarin hij nogmaals benadrukt dat hij niet ingaat op ons aanbod. We brengen deze mislukte poging als volgt tot uiting in ons C#-programma:

Landvoogd nieuweLandvoogd = landsknecht as Landvoogd;
if (nieuweLandvoogd == null)
{
   // resultaat = null en zo ook 
   // onze werkgroep die is opeens ook null
   Console.WriteLine(landsknecht.Naam + 
   " wil nog steeds niet landvoogd worden." +
   Environment.NewLine);
}

Het resultaat van de as operator is null. Willem Tell komt niet opdagen als zijnde de nieuwe landvoogd (en de leden van de werkgroep ook niet).

up | down

cast

Onze pogingen worden met de nodige hoon en minachting door Gessler gade geslagen. Gessler verklaart dat wij maar prutsers zijn. Hij zal de klus wel klaren mits hij maar genoeg medewerkers en middelen krijgt. We geven Gessler zijn zin en de landvoogd gaat op pad.

Helaas wordt het een enorm fiasco. Gessler keert een beetje dood terug van zijn expeditie en ons C# bestuursinstrument crashed met een exception. We brengen het mislukken van de expeditie als volgt tot uiting in ons C# programma met een cast:

  // Casten
  Landvoogd nieuweLandvoogd2 = 
  (Landvoogd)landsknecht;
}

catch (Exception ex)
{               
  Console.WriteLine("Casten geeft een exception");
  Console.WriteLine("Gessler is een beetje dood nu");
  Console.WriteLine("De regio ontdoet zich van ons");
  Console.WriteLine(ex.Message);
  Console.WriteLine(ex.GetType());
}

up | down

Slot

Je hebt mijn artikel gelezen en je hebt het gehaald tot dit punt? Dat doet me deugd. Ik ben er zo te zien in geslaagd je aandacht vast te houden tot het einde van dit artikel met een verhaal over Willem Tell en de C# Is, As, GetType en TypeOf operatoren.

Je zou nu kunnen “Googlen” naar de artikelen van andere auteurs die ook iets hebben geschreven over de C# Is, As, GetType en TypeOf operatoren. En als je een interessant artikel hebt gevonden dan hoop ik dat mijn artikel je kan helpen in het doorgronden van het artikel van die andere auteur. Ik hoop je weer terug te zien in één van mijn volgende blog posts. Wil je weten wat ik nog meer over C# heb geschreven? Hit the C# button…

up | down


Voorbeeldprogramma:

using System;

namespace GegevensTypes
{
  class MainClass
  {
    class Landsknecht
    {
     public string Naam { get; set; }
    }

    class Landvoogd : Landsknecht
    {
      public string Kanton { get; set; }
    }

    public static void Main(string[] args)
    {
      try
      {
        // object
        Landsknecht landsknecht = new Landsknecht();
        landsknecht.Naam = "Willem Tell";
        Landvoogd landvoogd = new Landvoogd();
        landvoogd.Naam = "Hermann Gessler";
        landvoogd.Kanton = "Uri";
        
        // Is-operator
        if (!(landsknecht is Landvoogd))
        {
          // de hoogwaardigheidsbekleders
          // komen onverrichterzake terug
          Console.WriteLine(landsknecht.Naam + 
          " is geen landvoogd.");
        }
        
        // ternary conditional operator
        bool gelukt = landsknecht is Landvoogd ? true : false;
        if (gelukt) Console.WriteLine("Poging is gelukt\r\n"); 
        else Console.WriteLine("Poging is mislukt.\r\n");
        
        // GetType en typeOf
        // Use typeof when you want to get the type at compilation time. 
        // Use GetType when you want to get the type at execution time. 
        if (landsknecht.GetType() != typeof(Landvoogd))
        {
          // de hoogwaardigheidsbekleders komen
          // besmeurd met pek en veren terug
          Console.WriteLine(landsknecht.Naam + 
          " is nog steeds geen landvoogd." + 
          Environment.NewLine);
        }
        
        // As-operator
        Landvoogd nieuweLandvoogd = landsknecht as Landvoogd;
        if (nieuweLandvoogd == null)
        {
          // resultaat = null en zo ook
          // onze werkgroep die is opeens ook null
          Console.WriteLine(landsknecht.Naam + 
          " wil nog steeds niet landvoogd worden." + 
          Environment.NewLine);
        }
                                                
        // Casten
        Landvoogd nieuweLandvoogd2 = 
        (Landvoogd)landsknecht;
      }      
      
      catch (Exception ex)
      {               
        Console.WriteLine("Casten geeft een Exception");
        Console.WriteLine("Gessler is een beetje dood nu");
        Console.WriteLine("De regio ontdoet zich van ons");
        Console.WriteLine(ex.Message);
        Console.WriteLine(ex.GetType());
      }
    }
  }
}

up

Laat een reactie achter

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *