Aus Linux-Magazin 11/2008

C#-Entwicklung unter Linux (Seite 3)

Listing 2:
»objectCollection.cs«

01 using System;
02 
03 namespace LinuxMagazineObjectPrinter
04 {
05   class Apfel {
06     public Apfel()
07     { Console.WriteLine("Im Apfel-Konstruktor: {0}", secret_); }
08 
09     private string secret_ = "Ich bin ein Apfel";
10   }
11 
12   class Birne {
13     public Birne()
14     { Console.WriteLine("Im Birnen-Konstruktor: {0}", secret_); }
15 
16     private string secret_ = "Ich bin eine Birne";
17   }
18 
19   class ObjectPrinter {
20     public ObjectPrinter(){
21       obstSammlung[0] = new Apfel();
22       obstSammlung[1] = new Birne();
23       // Der folgende Code führt zum Werfen einer Ausnahme
24       // obstSammlung[2] = new Birne();
25     }
26 
27     public void print(){
28       int laenge = obstSammlung.Length;
29       for(int i=0; i<laenge; i++){
30         Console.WriteLine(obstSammlung[i].ToString());
31       }
32     }
33 
34     private object[] obstSammlung = new object[2];
35   }
36 }

Ab Zeile 5 definiert Listing 2 die Klassen mit den Namen »Apfel« und »Birne«. Anders als in C++ darf der Programmierer private Variablen direkt im Klassenrumpf initialisieren. Der Konstruktor kann auf diese Informationen zurückgreifen. Die beiden Klassen demonstrieren auch, wie sich in C# öffentliche und private Elemente erzeugen lassen. Die Klasse »ObjectPrinter« enthält ein Array von zwei Objekten, dem der Konstruktor jeweils ein Objekt vom Typ »Apfel« und eines vom Typ »Birne« zuweist.

Adressiert

Klassen sind Referenztypen. Das bedeutet, dass das Array »obstSammlung[]« nicht die Klassen oder deren Objekte selbst, sondern lediglich ihre Speicheradresse enthält. Dies können sich C- oder C++-Programmierer wie Pointer vorstellen, auch wenn sie durch die Referenz nicht ohne Weiteres Zugriff auf den Speicher selbst erhalten.

Putzdienst

Die mit »new« angelegten Referenztypen verwaltet in C# ein Garbage-Collector. Der Entwickler muss sich nicht selber um das Aufräumen kümmern. Dieser Ansatz ist komfortabel, gerät jedoch gelegentlich wegen seines Performance-Overheads in die Kritik. Herauszufinden, wann ein Objekt nicht mehr gebraucht wird und der Garbage-Collector es löschen darf, bedeutet zusätzlichen Aufwand.

Neben den Referenztypen kennt C# die Wertetypen wie »int«, »float«, »double«, »decimal« und »bool«. Die Schlüsselwörter »int« oder »bool« sind dabei nicht nur Kurzschreibweisen für die Klassen »System.Int32« und »System.Boolean«. Listing 1 hat demonstriert, wie sich bestimmte, im Sprachumfang enthalten Methoden weitervererben.

Listing 3 ergänzt Listing 2 um die sehr kurze Methode »Main«. Diese bindet den Namensraum der »ObjectPrinter«-Klasse aus Listing 2 ein, instanziiert ein passendes Objekt und ruft die »print()«-Methode des Objekts auf. Die beiden Dateien lassen sich mit »gmcs main.cs objectCollection.cs« übersetzen.

Der Aufruf von »mono main.exe«, gibt folgende Ausgabe zurück:

Im Apfel-Konstruktor: Ich bin ein Apfel
Im Birnen-Konstruktor: Ich bin eine Birne
In HalloWelt2.Main():
LinuxMagazineObjectPrinter.Apfel
LinuxMagazineObjectPrinter.Birne

Die ersten beiden Zeilen stammen von den Konstruktoren der Klassen »Apfel« und »Birne«. Die beiden letzten Zeilen erzeugen »Apfel.ToString()« sowie »Birne.ToString()«, die Zeile 30 über das Array »obstSammlung[]« indirekt aufruft.

Die Methode »ToString()« stammt aus der »System.Object«-Klasse der C#-Standard-Bibliothek. Sie ist aber nicht dafür ausgelegt, spezifische Informationen zu den beiden Klassen auszugeben. Sie liefert daher einfach den voll qualifizierten Namen inklusive Namensraum zurück. Wie sich die Umwandlung eines Objekts in einen String mit Hilfe von polymorpher Vererbung aufschlussreicher gestalten lässt, erläutert der nächste Teil der C#-Serie.

Listing 3:
»main.cs«

01 using System;
02 using LinuxMagazineObjectPrinter;
03 
04 namespace LinuxMagazinHelloWorld2
05 {
06   class HalloWelt2
07   {
08     public static void Main(string[] args)
09     {
10       ObjectPrinter opr = new ObjectPrinter();
11       Console.WriteLine("In HalloWelt2.Main():");
12       opr.print();
13     }
14   }
15 }

Schweizer Taschenmesser

Stabil liegt die komfortable Entwicklungsumgebung Monodevelop bisher erst in Version 1.0 vor [9]. Momentan fehlen noch einige wünschenswerte Features, Version 2.0 steht aber schon vor der Tür. Monodevelop 1.0 ist in den verbreiteten Distributionen enthalten. Aktuellere Versionen sind eventuell auf dem Open-Suse-Buildservice [11] zu finden.

LINUX-MAGAZIN KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Readly Logo
E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben