public void TestMethod1()
        {
            var FredVollgas = new Autobahn.Auto("Ferrari", "F4", 100);
            var RudiNormalo = new Autobahn.Auto("VW", "Passat", 103);
            var Susi = new Autobahn.Auto("Citroen", "Ente", 105);

            // Eventhandler registrieren
            FredVollgas.Hupen += new Autobahn.Auto.DGHupen(RudiNormalo.HöreHupe);
            FredVollgas.Hupen += new Autobahn.Auto.DGHupen(Susi.HöreHupe);

            // Events sind im Sinne des Aufrufes privat, bezüglich des Zugriffs öffentlich
            //FredVollgas.Hupen(99);


            // Ohne Schlüsselwort event wäre folgendes möglich
            // FredVollgas.Hupen(99);


            for (int i = 0; i < 1000; i++)
            {
                FredVollgas.fahre(100, 1);
                RudiNormalo.fahre(30, 1);
                Susi.fahre(20, 1);

                // Situation bewerten
                FredVollgas.SituationBewerten(RudiNormalo, Susi);
            }

        }
        public void TestMethod1()
        {
            Auto HugosSchrottkiste = new Auto();

            HugosSchrottkiste.EntfernungVonStuttgartInKm = 200;

            //HugosSchrottkiste.Dispose();

            // Um die explizit implementierte Dispose- Methode aus IDisposable aufzurufen, muß zuvor ein Schnittstellenzeiger gezogen werden
            IDisposable ptrIDsp = HugosSchrottkiste;
            ptrIDsp.Dispose();

            ((IDisposable)HugosSchrottkiste).Dispose();

            // Simmulation von 'Scope' in C++
            using (var Silberpfeil = new Auto("Mercedes", "Rennauto"))
            {
                Debug.WriteLine(Silberpfeil.Marke);
            } // Hier wird automatisch Dispose aufgerufen

            // Im unsing- Block können nur Objekte instanziiert werden, deren Klasse
            // IDisposable implementieren
            //using (var Zentrum = new Point(1, 2))
            //{

            //}

            try
            {
                var Silberpfeil2 = new Auto("Mercedes", "Rennauto2");
                //using(var heute = DateTime.Now)
                using (var fredVollgas = new Auto("Ferrari", "Testarossa"))
                using (var KunoTunichtGut = new Auto("Alpha", "Romeo"))
                {
                    Debug.WriteLine(Silberpfeil2.Marke);
                    // Plötzlich passiert ein Fehler
                    throw new Exception();
                    Debug.WriteLine("Nach dem Fehler");
                }
                // Überschreiten der using- Blockgrenze fürht automat. zum Aufruf von 
                // Dispose
                ((IDisposable)Silberpfeil2).Dispose();
            }
            catch (Exception)
            {
                Debug.WriteLine("Fehler aus using- Block wurde behandelt");
            }






            // Die bessere Lösung wäre wohl nur explizite Implementierung zuzulassen, wobei der Zugriff auf die Schnittstellenelemente 
            // von c# unterstützt wird wie folgt
            // HugosSchrottkiste.IDisposable.Dispose();


            for (int k = 0; k < 100; k++)
            {
                Auto FredVollgas = new Auto("Ferrari", "Nr " + k, 0, 80);

                do
                {
                    double[] v = { 20, 30, 10, 40, 50, 60, 30, 10 };
                    double[] t = { 40, 20, 30, 5, 3, 7, 10, 15 };

                    // Simulation: Vorankommen auf dem hat umkämpften linken Fahrstreifen
                    for (int i = 0; i < v.Length; i++)
                    {
                        FredVollgas.fahre(v[i], t[i]);
                        //Debug.WriteLine("Aktuelle Position von Fred Vollgas: {0:N3}", FredVollgas.EntfernungVonStuttgartInKm);
                    }
                } while (FredVollgas.EntfernungVonStuttgartInKm < 50.0);
            }

            for (int k = 0; k < 100; k++)
            {
                Auto FredVollgas = new Auto("VW", "Nr " + k, 0, 80);
                using (Auto FredVollgas2 = new Auto("VW", "Nr " + k, 0, 80))
                {
                    do
                    {
                        double[] v = { 20, 30, 10, 40, 50, 60, 30, 10 };
                        double[] t = { 40, 20, 30, 5, 3, 7, 10, 15 };

                        if (k == 50)
                            goto Sprungmarke;

                        // Simulation: Vorankommen auf dem hat umkämpften linken Fahrstreifen
                        for (int i = 0; i < v.Length; i++)
                        {
                            FredVollgas2.fahre(v[i], t[i]);
                            //Debug.WriteLine("Aktuelle Position von Fred Vollgas: {0:N3}", FredVollgas2.EntfernungVonStuttgartInKm);
                        }
                    } while (FredVollgas2.EntfernungVonStuttgartInKm < 50.0);

                } // Ende using- Block
                //Einen "Schnittstellenzeiger ziehen", um auf die explizit definierte Dispose- Methode zuzugreifen
                //IDisposable dsp = FredVollgas;
                //dsp.Dispose();
            }
            Sprungmarke:;
        }
        public void TestMethod1()
        {

            StoppUhr meineStoppuhr = new StoppUhr();

            // Zugriff auf den inneren Zustand durch schreiben in eine Eigenschaft
            meineStoppuhr.ZeitInMsEigenschaft = 1000;


            // Lesen des inneren Zustandes durch lesen einer eigenschaft
            double gestoppteZeit = meineStoppuhr.ZeitInMsEigenschaft;

            // Events austesten
            meineStoppuhr.ZeitLimitInMs = 1000;

            // Eventhandler registrieren
            meineStoppuhr.ZeitlimitUeberschrittenEvent += MeinEventhandler;

            // wg. dem Schlüsselwort event kann der Delegate nicht m,ehr über die Objektinstanz direkt aufgeufen werden
            //meineStoppuhr.ZeitlimitUeberschrittenEvent(1, 2);

            meineStoppuhr.Start();

            System.Threading.Thread.Sleep(2000);

            meineStoppuhr.Stopp();

            // Eventhandler wieder abkoppeln
            meineStoppuhr.ZeitlimitUeberschrittenEvent -= MeinEventhandler;
            // anderen ankoppeln
            meineStoppuhr.ZeitlimitUeberschrittenEvent += MeinAndererEventhandler;

            meineStoppuhr.Start();

            System.Threading.Thread.Sleep(2000);

            meineStoppuhr.Stopp();


            // Beide Eventhandler ankoppeln
            meineStoppuhr.ZeitlimitUeberschrittenEvent += MeinEventhandler;

            meineStoppuhr.Start();

            System.Threading.Thread.Sleep(2000);

            meineStoppuhr.Stopp();



            Wasserhahn kleinerHahn = new Wasserhahn(25.4),
            Absperrhahn = new Wasserhahn(50.8);


            kleinerHahn.öffnen(50.0);
            Absperrhahn.öffnen(100.0);



            kleinerHahn.öffnen(20);
            Absperrhahn.öffnen(100);

            Console.WriteLine("Öffnung kleiner Hahn in %: {0:N1}", kleinerHahn.ÖffnungInPromille / 10);

            kleinerHahn.ÖffnungInPromille = 333;

            Console.WriteLine("Öffnung kleiner Hahn in %: {0:N1}", kleinerHahn.ÖffnungInPromille / 10);

            // Zugriff auf statische Methoden
            Console.WriteLine("Durchfluss: {0:N3}", Wasserhahn.DurchflussInCm3ProSekunde(kleinerHahn, 10));

            // Arbeiten mit der Klasse Auto

            // Objekte konstuieren oder synonym Instanzen instanziieren

            Auto FredVollgas = new Auto("Ferrari", "Testarossa");
            

            // nur lesbare Eigenschaft kann nicht gesetzt werden
            //FredVollgas.VolleFahrzeugbezeichnung = "Porsche/Carrera";
            Debug.WriteLine(FredVollgas.VolleFahrzeugbezeichnung);

            // Eine Eigenschaft mit intelligenten Gettern und Settern

            // Compiler wandelt Zuweisung um in FredVollgas.EntfernungVonStuttgartInKm.set(100);
            FredVollgas.EntfernungVonStuttgartInKm = 100;



            // Anlegen von SusiSchleicher mit dem 2. Konstruktor (startet bei 50km)
            Auto SusiSchleicher = new Auto("VW", "Käfer", 50, 10);


            Auto AntonNormalo = new Auto("VW", "Golf", 10, 120);

            // Neu ab .NET 3.5 Objektinitialisierer: Dynamisch einen Konstruktor der Wahl schaffen
            Auto RudiHandwerker = new Auto("Audi", "A6", 25);


            Auto[] fahrsteifen = new Auto[] {
                new Auto("Fiat", "Stilo", 99),
                new Auto("Dacia", "Logan", 200),
                new Auto("VW", "Golf", 150)
            };


            Console.WriteLine("Der Wagen von Fred Vollgas iste ein " + FredVollgas.Marke + " Modell " + FredVollgas.Modell);
            // Marke ist eine nur lesbare Eigenschaft
            //SusiSchleicher.Marke = "Ferrari";

            // Fahren und Position über den Rückgabewert der Methode bestimmen
            double pos = FredVollgas.fahre(50, 5);

            Console.WriteLine("Aktuelle Position von Fred Vollgas: {0:N3}", FredVollgas.EntfernungVonStuttgartInKm);

            double[] v = { 20, 30, 10, 40, 50, 60, 30, 10 };
            double[] t = { 40, 20, 30, 5, 3, 7, 10, 15 };

            // Simulation: Vorankommen auf dem hat umkämpften linken Fahrstreifen
            for (int i = 0; i < v.Length; i++)
            {
                FredVollgas.fahre(v[i], t[i]);
                Console.WriteLine("Aktuelle Position von Fred Vollgas: {0:N3}", FredVollgas.EntfernungVonStuttgartInKm);
            }

        }