Basis Namensräume und Typen der FCL
Jede Klasse ist in einem Namensraum (Namespace) untergebracht, welcher ihren Zweck sinnvoll beschreibt, und im .NET Framework gibt es viele Namensräume. A grundlegender, vollständig qualifizierter Klassenname ist
System.Collections.ArrayList. Der Teil links vom letzten Punkt ist i.A. der Namensraum, der rechte Teil ist der Klassenname
(Notiz 1). Alle Klassen der
FCL sind im Root-Namensraum
System untergebracht. Klassen von Drittanbietern sollten, wenn möglich, innerhalb eines Namensraum mit folgendem Format
Firmenname.
Technologiename untergebracht sein. Zum Beispiel:
Borland.Delphi.System ist der vollständig qualifizierte Name der Delphi System
Unit.
Die
FCL basiert auf dem
Common Type System (allgemeines Typensystem, siehe
CLS). Das Common Type System ermöglicht es der
FCL mit verschiedenen Sprachen in der "verwalteten Laufzeitumgebung" (Managed Runtime) zu operieren.
Wertetypen (Value Types) vs. Refenztypen (Reference Types)
Wertetype sind direkt für ihre Werte verantwortlich und i.A. auf dem Stack hinterlegt. Referenztypen speichern eine Referenz (Zeiger, Verweis) auf deren Daten und sind auf dem Heap gesichert. Wertetypen sind allgemein primitive Typen, wie z.B. ordinale Typen. Referenztypen hingegen sind i.A. Objekte, wie z.B.
System.Windows.Forms.Control. Die Änderung eines Werte in einem Wertetypen verändert nur die spezielle Instanz dieses Werte, da diese eine Kopie ihres Wertes enthalten.
Folgendes C# Beispiel soll das verdeutlichen:
Code:
Point firstPoint = [b]new[/b] Point(5, 5);
Point secondPoint = firstPoint;
firstPoint.X = 6;
In der zweiten Zeile wird
secondPoint der Wert von
firstPoint zugewiesen; es wird eine Kopie des Werte von
firstPoint hinterlegt. Dieser hat die Werte X=5 und Y=5. In der dritten Zeile wird
firstPoint.X der Wert 6 zugewiesen. Das verändert nur den Wert in
firstPoint.X,
secondPoint.X hält weiterhin den Wert 5.
Betrachten wir nun folgenden C# Code:
Code:
Control firstControl = [b]new[/b] Control();
Control secondControl = firstControl;
firstControl.BackColor = Color.Red;
In der zweiten Zeile wird
secondControl ein Verweis auf auf
firstControl zugewiesen. Die Veränderung des Wertes
firstControl.BackColor in der dritten Zeile verändert daher auch den Wert in
secondControl.BackColor da der Wert von Typ Control ein Referenzwert ist.
In der
FCL sind alle Basistypen, wie z.B. Integer und Boolean (auch Aufzählungen), Wertetypen. Fast alle anderen Klassen sind in der Regel Referenztypen, so auf System.String. In der Programmierung wird ein Wertetyp durch
struct (in C#) oder
record (in Delphi) erstellt, Referenztypen hingegen werden mit Hilfe von
class erstellt.
Das Boxing von Typen
Es ist in .NET möglich Wertetypen in Referenztypen (und zurück) umzuwandeln. Dazu folgendes C# Beispiel:
Code:
[b]object [/b]obj = null; [i]// a reference type[/i]
[b]int [/b]i = 5; [i]// a value type[/i]
obj = i; [i]// boxing[/i]
[i]//i = obj; // compiler error[/i]
i = ([b]int[/b])obj; [i]// unboxing: the value type is copied to i[/i]
In der dritten Zeile wird der Wertetype implizit als Referenztyp "geboxt". In C# kann man Objekttypen nicht Wertetypen zuweisen, deshalb würde die vierte Zeile auch einen Compiler-Fehler provozieren. Man muss den Wert explizit als Wertetyp darstellen, dadurch wird der Wert kopiert.
Beachte, dass Delphi selbst als sehr typensicher gilt und betrachte den folgenden (zu oben analogen) Delphi.NET Quellcode:
Delphi-Quellcode:
var
I: Integer;
Obj: TObject;
begin
I := 5;
Obj := I; // Compiler error: Incompatible types
// I := Obj; // Expected compiler error
I := Integer(Obj);
end.
Obiger Code lässt sich in Delphi nicht kompilieren, da in der zweiten Zeile die Typensicherheit nicht gewährleistet wird. In diesem Fall gibt es für den Delphi-Programmierer zwei Lösungsmöglichkeiten. Entweder durch explizites casten des Wertes in ein TObject:
Obj := TObject(I);
oder durch den Compilerschalter
AUTOBOX, welcher irgenwo vor der "Problemzeile" erscheinen muss:
{$AUTOBOX ON}
Der Compilerschalter
AUTOBOX zwingt den Delphi-Compiler weniger typensicher zu agieren und lässt Delphi so etwas mehr wie C# erscheinen. Die Nutzung kann die Programmierung erleichtern, allerdings kann es auch schneller zu Programmierfehlern führen.
Schnittstellentypen (Interface Types)
In der
FCL existieren viele Interfacetypen und diese kann man auch in gewohnter Art und Weise einsetzen. Interfaces sind abstrakte Deklarationen welche durch Klassen (Referenztypen) implementiert werden.
(Notiz 1) Eine Ausnahme zu dieser Regel sind verschachtelte Typen.