Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Über den Autor
Vorwort zur 4. Auflage
1 Allgemeine Einführung in .NET
2 Grundlagen der Sprache C#
3 Klassendesign und Vererbung
4 Weitere .NET-Datentypen
5 Weitere Möglichkeiten von C#
6 Projektmanagement und Visual Studio 2008
7 Fehlerbehandlung und Debugging
8 LINQ
9 Multithreading und asynchrone Methodenaufrufe
10 Arbeiten mit Dateien und Streams
11 Serialisierung
12 Einige wichtige .NET-Klassen
13 Grundlagen zum Erstellen einer Windows-Anwendung
14 Die wichtigsten Steuerelemente
15 Tastatur- und Mausereignisse
16 MDI-Anwendungen
17 Grafische Programmierung mit GDI+
18 Das Drucken (Printing)
19 Steuerelemente entwickeln
20 Programmiertechniken
21 WPF – die Grundlagen
22 Die Layoutcontainer
23 Die WPF-Controls
24 Konzepte von WPF
25 ADO.NET – die Verbindung zu einer Datenbank herstellen
26 Die Datenbankabfrage
27 Der SqlDataAdapter
28 Daten im lokalen Speicher – das DataSet
29 Eine Datenbank aktualisieren
30 Stark typisierte DataSets
31 Weitergabe von Anwendungen
Stichwort

Buch bestellen
Ihre Meinung?

Spacer
<< zurück
Visual C# 2008 von Andreas Kuehnel
Das umfassende Handbuch
Buch: Visual C# 2008

Visual C# 2008
geb., mit DVD
1.366 S., 49,90 Euro
Rheinwerk Computing
ISBN 978-3-8362-1172-7
Pfeil 3 Klassendesign und Vererbung
Pfeil 3.1 Einführung in die Objektorientierung
Pfeil 3.1.1 Vorteile der objektorientierten Programmierung
Pfeil 3.2 Die Klassendefinition
Pfeil 3.2.1 Die Deklaration von Objektvariablen
Pfeil 3.2.2 Zugriffsmodifizierer einer Klasse
Pfeil 3.2.3 Splitten einer Klassendefinition mit »partial«
Pfeil 3.3 Referenz- und WertetypenWertetyp
Pfeil 3.4 Die Eigenschaften eines Objekts (Felder)
Pfeil 3.4.1 Vereinfachte Objektinstanziierung
Pfeil 3.5 Arbeiten mit Objektreferenzen
Pfeil 3.5.1 Prüfen auf Initialisierung
Pfeil 3.5.2 Mehrere Referenzen auf ein Objekt
Pfeil 3.5.3 Referenzvergleiche
Pfeil 3.6 Objektmethoden
Pfeil 3.6.1 Der Aufruf einer Methode
Pfeil 3.6.2 Methoden mit Parameterliste
Pfeil 3.6.3 Rückgabewert einer Methode
Pfeil 3.6.4 Variablen in einer Methode
Pfeil 3.6.5 Zugriffsmodifizierer einer Methode
Pfeil 3.6.6 Besondere Aspekte einer Parameterliste
Pfeil 3.6.7 Referenz- und Wertparameter
Pfeil 3.6.8 Methodenüberladung
Pfeil 3.6.9 Aufruf überladener Methoden mit impliziter Konvertierung
Pfeil 3.7 Objekteigenschaften
Pfeil 3.7.1 Datenkapselung mit Eigenschaftsmethoden sicherstellen
Pfeil 3.7.2 Die Ergänzung der Klasse »Circle«
Pfeil 3.7.3 Lese- und schreibgeschützte Eigenschaften
Pfeil 3.7.4 Sichtbarkeit der Accessoren »get-Accessor« und »set-Accessor«
Pfeil 3.7.5 Automatisch implementierte Eigenschaften
Pfeil 3.7.6 Konstanten in einer Klasse
Pfeil 3.7.7 Methode oder Eigenschaft?
Pfeil 3.7.8 Die Trennung von Daten und Code
Pfeil 3.7.9 Der Zugriff auf private Daten
Pfeil 3.8 Konstruktoren
Pfeil 3.8.1 Die Konstruktoren in der Klasse »Circle«
Pfeil 3.8.2 Die Konstruktoraufrufe
Pfeil 3.8.3 Definition von Konstruktoren
Pfeil 3.8.4 »internal«-Konstruktoren
Pfeil 3.8.5 »private«-Konstruktoren
Pfeil 3.8.6 Konstruktorverkettung
Pfeil 3.9 Der Destruktor
Pfeil 3.9.1 Das Zerstören von Objekten
Pfeil 3.9.2 Der Garbage Collector
Pfeil 3.9.3 Die Bereitstellung eines Destruktors
Pfeil 3.9.4 Das Zerstören eines Objekts
Pfeil 3.9.5 Die »Dispose«-Methode
Pfeil 3.9.6 Der Garbage Collector in Aktion
Pfeil 3.10 Statische Klassenkomponenten
Pfeil 3.10.1 Begrifflichkeiten
Pfeil 3.10.2 Die Realisierung eines Objektzählers
Pfeil 3.10.3 Zugriff auf statische Komponenten
Pfeil 3.10.4 Statische Klassenvariable in der Klasse »Circle«
Pfeil 3.10.5 Klassenspezifische Methoden
Pfeil 3.10.6 Statische Klasseninitialisierer
Pfeil 3.10.7 Statische Klassen
Pfeil 3.10.8 Stand der Klasse »Circle«
Pfeil 3.11 Die Vererbung
Pfeil 3.11.1 Basisklassen und abgeleitete Klassen
Pfeil 3.11.2 Die Ableitung einer Klasse
Pfeil 3.11.3 Klassen, die nicht abgeleitet werden können
Pfeil 3.11.4 Konstruktoren in abgeleiteten Klassen
Pfeil 3.11.5 Der Zugriffsmodifizierer »protected«
Pfeil 3.11.6 Die Konstruktorverkettung in der Vererbung
Pfeil 3.11.7 Destruktor-Verkettung in der Vererbung
Pfeil 3.11.8 Die Methoden in einer abgeleiteten Klasse
Pfeil 3.11.9 Überladen einer Basisklassenmethode
Pfeil 3.11.10 Typumwandlung von Objektvariablen
Pfeil 3.12 Abstrakte Klassen und Methoden
Pfeil 3.12.1 Problembeschreibung
Pfeil 3.12.2 Abstrakte Definitionen
Pfeil 3.13 Polymorphismus
Pfeil 3.13.1 Virtuelle Methoden
Pfeil 3.13.2 Inhomogene Mengen
Pfeil 3.13.3 Verdecken und Überschreiben geerbter Methoden
Pfeil 3.13.4 Versiegelte Methoden
Pfeil 3.13.5 Das Projekt »CircleApplication« ergänzen
Pfeil 3.14 Hat-eine-Beziehungen (Aggregation)
Pfeil 3.14.1 Innere Klassen
Pfeil 3.15 Namensräume (Namespaces)
Pfeil 3.15.1 Zugriff auf Namespaces
Pfeil 3.15.2 Die »using«-Direktive
Pfeil 3.15.3 Vermeiden von Mehrdeutigkeiten
Pfeil 3.15.4 Aufrufe mit dem »::«-Operator umleiten
Pfeil 3.15.5 Namespaces festlegen


Galileo Computing - Zum Seitenanfang

3.3 Referenz- und Wertetypen topZur vorigen Überschrift

Das .NET-Typsystem setzt sich aus zwei Subsystemen zusammen:

  • Wertetypen
  • Referenztypen

Zu den Wertetypen werden primitive Datentypen wie int und long sowie die auf Strukturen und Enumerationen basierenden Typen gezählt, denen wir uns in Kapitel 4 widmen. Zu den Referenztypen gehören der Typ string, alle Arrays und – ganz allgemein ausgedrückt – alle klassenbasierten Objekte. Obwohl es im ersten Augenblick den Anschein haben mag, dass hinter Wertetypen nur »normale« Dateninformationen stehen, werden auch diese als Objekte angesehen und hinter den Kulissen der .NET Laufzeit als solche behandelt.

Der Unterschied zwischen Referenz- und Wertetypen ist in der Allozierung des Systemspeichers zu finden. Eine Variable, die einen Wertetyp repräsentiert, alloziert auf dem Stack Speicher für die Daten. Der Stack ist im RAM angesiedelt, wird aber vom Prozessor durch einen sogenannten Stack Pointer direkt unterstützt. Dieser ist in der Lage, auf dem Stack neuen Speicher zu reservieren, kann ihn aber auch freigeben. Dieses Verfahren ist sehr effizient und schneller als das Allozieren von Speicher im Heap für Referenztypen.

Als Heap wird der Speicher im RAM bezeichnet, der allgemeinen Zwecken zur Verfügung steht. Dazu gehören auch die Zustandsdaten eines Objekts. Der Compiler weiß nicht, wie viel Speicher er zur Laufzeit eines Programms im Heap allozieren muss und wie lange die Allozierung aufrechterhalten bleibt. Das garantiert natürlich ein hohes Maß an Flexibilität, da zur Laufzeit eine zur Entwicklungszeit nicht vorhersehbare Anzahl von Objekten erzeugt werden kann. Die Flexibilität gibt es jedoch nicht kostenlos: Es dauert etwas länger, auf dem Heap Speicher zu reservieren.

Wird mit

int intVar = 100;

eine int-Variable deklariert, schreibt sich der 32-Bit-Wert in den Stack. Beachten Sie bitte, dass bei einem Wertetyp der new-Operator zur Initialisierung nicht angegeben werden muss – bei einem Referenztyp ist das eine unabdingbare Forderung, denn erst mit

Circle kreis = new Circle();

wird auf dem Heap ein Speicherbereich alloziert und initialisiert, auf den danach die Referenz kreis zeigt.

Ein daraus folgendes, wichtiges Unterscheidungsmerkmal zwischen Referenz- und Wertetypen ist, dass Wertetypen niemals den Inhalt null haben können. Wenn mit

Circle kreis;

eine auf einer Klasse basierende Objektvariable deklariert wird, ohne mit new initialisiert zu werden, ist deren Inhalt null.

Bemerkenswert ist die unterschiedliche Wirkungsweise des Zuweisungsoperators zwischen einem Werte- und einem Referenztyp. Betrachten Sie dazu zunächst das Codefragment eines Wertetyps:

long lngVar = 64; 
long lngSecond = lngVar;

Nach der Ausführung des Codes existieren zwei Variablen vom Typ long, die denselben Inhalt haben. long wird von der Common Language Runtime als Wertetyp angesehen und entsprechend behandelt. Die Änderung des Inhalts der Variablen lngVar wird sich nicht auf den Inhalt der Variablen lngSecond auswirken, weil zwischen den beiden keine Verbindung existiert.

Nun soll ein ähnliches Codefragment betrachtet werden, diesmal allerdings auf Basis eines Referenztyps.

Circle kreis1 = new Circle(); 
Circle kreis2 = new Circle(); 
kreis2 = kreis1; 
kreis1.Radius = 320; 
Console.WriteLine(kreis2.Radius);

In diesem Programmausschnitt werden zunächst zwei Objekte gleichen Typs erzeugt. Anschließend wird die Referenz, die auf das zweite Objekt im Speicher zeigt, auf die Adresse des ersten umgebogen. Die Ausgabe an der Konsole (= 320) beweist, dass beide Objektvariablen mit demselben Objekt im Speicher operieren. Der Zuweisungsoperator, angewandt auf Referenztypen, bewirkt demnach ein Verbiegen des Zeigers, bei Wertetypen einen Kopiervorgang.



Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen. >> Zum Feedback-Formular
<< zurück
  Zum Katalog
Zum Katalog: Visual C# 2008
Visual C# 2008
Jetzt bestellen


 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: Visual C# 2012






 Visual C# 2012


Zum Katalog: Professionell entwickeln mit Visual C# 2012






 Professionell
 entwickeln mit
 Visual C# 2012


Zum Katalog: Windows Presentation Foundation






 Windows Presentation
 Foundation


Zum Katalog: Schrödinger programmiert C++






 Schrödinger
 programmiert C++


Zum Katalog: C++ Handbuch






 C++ Handbuch


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo




Copyright © Rheinwerk Verlag GmbH 2008
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de