Indexer

Mit einem Indexer können zu einer Klasse indizierte Zugriffe programmiert werden, ähnlich wie sie bei den Arrays definiert sind. Im Beispiel wird ein internes Arrays von Strings definiert. Der Indexer erlaubt den direkten Zugang auf dieses Array, indem er den übergebenen Index auf den Zugriff des internen Arrays umsetzt.

        
        // Interne Objekte
        private string[] _astrCartoons = new string[] {
            "Tim und Struppi",      // Platz 1
            "Asterix und Obelix",   // Platz 2
            "Micky und Goofy",      // Platz 3
            "Road Runner",          // Platz 4
            "Fix und Foxi",         // Platz 5
            "Donald Duck" };        // Platz 6

        // Indexer
        public string this[uint uiIndex] {

            // getter
            get {
                // Bereichsprüfung des Index
                if (uiIndex < 1 || uiIndex > _astrCartoons.Length) {
                    throw new ArgumentOutOfRangeException();
                } else {
                    // Auslesen des entsprechenden Wertes
                    return _astrCartoons[uiIndex-1];
                }
            }

            // setter
            set {
                // Bereichsprüfung des Index
                if (uiIndex < 1 || uiIndex > _astrCartoons.Length) {
                    throw new ArgumentOutOfRangeException();
                } else {
                    // Auslesen des entsprechenden Wertes
                    _astrCartoons[uiIndex-1] = value;
                }
            }
        }

Ein Objekt der Klasse CIndexer wird instanziert und die Werte des Arrays _astrCartoons[] werden mittels Indexer ausgelesen. Mit der getter Methode wird der entsprechende Wert ausgelesen, falls der Index grösser als 6 ist wird eine ArgumentOutOfRangeException ausgelöst.

            
CIndexer objIndexer = new CIndexer();
Console.WriteLine("Auf dem 1.Platz ist: " + objIndexer[1]);
Console.WriteLine("Auf dem 2.Platz ist: " + objIndexer[2]);
Console.WriteLine("Auf dem 3.Platz ist: " + objIndexer[3]);


Die Operatoren checked und unchecked

Informationen werden in Form von Typen gespeichert, die einen Wertebereich haben. Ween dieser Wertebereich über oder unterschritten wird, bedeutet das für die binäre Repräsentation, dass ein Überlauf der Wertigkeit stattfindet. Mit der Anweisung checked können wir zur Laufzeit solche Fehler erkennen und mittels Fehlerbehandlung gezielt Massnahmen einleiten. Standardmässig kompiliert C# den Code im unchecked-Verfahren, somit werden Überlauffehler nicht geahndet. Wenn man auf den Überlauf achten muss kann man das Schlüsselwort checked brauchen.

 try {
      // Keine Überlaufkontrolle
      int i = int.MaxValue; // 2147483647
      i++; // -2147483648

      // Überlaufkontrolle
      checked
      {
           int x = int.MaxValue; // 2147483647
           x++; // OverflowException -> Arithmetic operation resulted in an overflow
      }
 }
 catch (OverflowException exc) {
     Console.WriteLine(exc.Message);
 }
 catch (Exception exc) {
     Console.WriteLine(exc.Message);
 }

Beim Code mit Überlaufskontrolle gibt es beim x++ eine OverflowException da der Maximale Integer Wert überschritten worde ist.


Array

Arrays ermöglichen grosse Anzahl von Variablen die den gleichen Namen und Datentyp haben zu definieren. Unterschieden werden die einzelne Elemente anhand einer Indizierung.
In diesem Listing wird Array myArr vom Typ integer erstellt mit drei Positionen.

int[] myArr = new int[3];

Bei der initialisierung kann man den drei Positionen auch gerade den Wert mitgeben

int[] myArr = new int[3]{23,9,7};

Was man bei der initialisierung beachten muss ist dass allen Elemente ein gültigen Wert übergeben wird. Deshalb ist die folgende Initialisierung nicht möglich

// fehlerhafte literale Initialisierung 
int[] myArr = new int[3]{23};

Der Zugriff auf die Elemente erfolgt via Indizierung.

Console.WriteLine("myArr[0] = {0}",myArr[0]);
// Ausgabe 23 


Switch – Anweisung

             // Switch evaluation
            switch (strValue) {
                case "1":
                case "3":
                case "5":
                case "7":
                case "9":
                    Console.WriteLine("Sie haben eine ungerade Zahl eingegeben.");
                    break;
                case "2":
                case "4":
                case "6":
                case "8":
                    Console.WriteLine("Sie haben eine gerade Zahl eingegeben.");
                    break;
                default:
                    Console.WriteLine("Sorry, ihre Eingabe entsprach nicht den Erwartungen.");
                    break;
            }
            Console.WriteLine("Hier gehts weiter.");


Follow

Get every new post delivered to your Inbox.