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

Inhaltsverzeichnis
Vorwort zur 6. Auflage
1 Allgemeine Einführung in .NET
2 Grundlagen der Sprache C#
3 Das Klassendesign
4 Vererbung, Polymorphie und Interfaces
5 Delegates und Ereignisse
6 Strukturen und Enumerationen
7 Fehlerbehandlung und Debugging
8 Auflistungsklassen (Collections)
9 Generics – Generische Datentypen
10 Weitere C#-Sprachfeatures
11 LINQ
12 Arbeiten mit Dateien und Streams
13 Binäre Serialisierung
14 XML
15 Multithreading und die Task Parallel Library (TPL)
16 Einige wichtige .NET-Klassen
17 Projektmanagement und Visual Studio 2012
18 Einführung in die WPF und XAML
19 WPF-Layout-Container
20 Fenster in der WPF
21 WPF-Steuerelemente
22 Elementbindungen
23 Konzepte von WPF
24 Datenbindung
25 Weitere Möglichkeiten der Datenbindung
26 Dependency Properties
27 Ereignisse in der WPF
28 WPF-Commands
29 Benutzerdefinierte Controls
30 2D-Grafik
31 ADO.NET – Verbindungsorientierte Objekte
32 ADO.NET – Das Command-Objekt
33 ADO.NET – Der SqlDataAdapter
34 ADO.NET – Daten im lokalen Speicher
35 ADO.NET – Aktualisieren der Datenbank
36 Stark typisierte DataSets
37 Einführung in das ADO.NET Entity Framework
38 Datenabfragen des Entity Data Models (EDM)
39 Entitätsaktualisierung und Zustandsverwaltung
40 Konflikte behandeln
41 Plain Old CLR Objects (POCOs)
Stichwort

Download:
- Beispiele, ca. 62,4 MB

Buch bestellen
Ihre Meinung?

Spacer
Visual C# 2012 von Andreas Kühnel
Das umfassende Handbuch
Buch: Visual C# 2012

Visual C# 2012
Rheinwerk Computing
1402 S., 6., aktualisierte und erweiterte Auflage 2013, geb., mit DVD
49,90 Euro, ISBN 978-3-8362-1997-6
Pfeil 3 Das Klassendesign
Pfeil 3.1 Einführung in die Objektorientierung
Pfeil 3.2 Die Klassendefinition
Pfeil 3.2.1 Klassen im Visual Studio anlegen
Pfeil 3.2.2 Das Projekt »GeometricObjectsSolution«
Pfeil 3.2.3 Die Deklaration von Objektvariablen
Pfeil 3.2.4 Zugriffsmodifizierer einer Klasse
Pfeil 3.2.5 Splitten einer Klassendefinition mit »partial«
Pfeil 3.2.6 Arbeiten mit Objektreferenzen
Pfeil 3.3 Referenz- und Wertetypen
Pfeil 3.3.1 Werte- und Referenztypen nutzen
Pfeil 3.4 Die Eigenschaften eines Objekts
Pfeil 3.4.1 Öffentliche Felder
Pfeil 3.4.2 Datenkapselung mit Eigenschaftsmethoden sicherstellen
Pfeil 3.4.3 Die Ergänzung der Klasse »Circle«
Pfeil 3.4.4 Lese- und schreibgeschützte Eigenschaften
Pfeil 3.4.5 Sichtbarkeit der Accessoren »get« und »set«
Pfeil 3.4.6 Unterstützung von Visual Studio 2012
Pfeil 3.4.7 Automatisch implementierte Eigenschaften
Pfeil 3.5 Methoden eines Objekts
Pfeil 3.5.1 Methoden mit Rückgabewert
Pfeil 3.5.2 Methoden ohne Rückgabewert
Pfeil 3.5.3 Methoden mit Parameterliste
Pfeil 3.5.4 Methodenüberladung
Pfeil 3.5.5 Variablen innerhalb einer Methode (lokale Variablen)
Pfeil 3.5.6 Referenz- und Wertparameter
Pfeil 3.5.7 Besondere Aspekte einer Parameterliste
Pfeil 3.5.8 Zugriff auf private Daten
Pfeil 3.5.9 Die Trennung von Daten und Code
Pfeil 3.5.10 Namenskonflikte mit »this« lösen
Pfeil 3.5.11 Methode oder Eigenschaft?
Pfeil 3.5.12 Umbenennen von Methoden und Eigenschaften
Pfeil 3.6 Konstruktoren
Pfeil 3.6.1 Konstruktoren bereitstellen
Pfeil 3.6.2 Die Konstruktoraufrufe
Pfeil 3.6.3 Definition von Konstruktoren
Pfeil 3.6.4 »public«- und »internal«-Konstruktoren
Pfeil 3.6.5 »private«-Konstruktoren
Pfeil 3.6.6 Konstruktorenaufrufe umleiten
Pfeil 3.6.7 Vereinfachte Objektinitialisierung
Pfeil 3.7 Der Destruktor
Pfeil 3.8 Konstanten in einer Klasse
Pfeil 3.8.1 Konstanten mit dem Schlüsselwort »const«
Pfeil 3.8.2 Schreibgeschützte Felder mit »readonly«
Pfeil 3.9 Statische Klassenkomponenten
Pfeil 3.9.1 Statische Eigenschaften
Pfeil 3.9.2 Statische Methoden
Pfeil 3.9.3 Statische Klasseninitialisierer
Pfeil 3.9.4 Statische Klassen
Pfeil 3.9.5 Statische Klasse oder Singleton-Pattern?
Pfeil 3.10 Namensräume (Namespaces)
Pfeil 3.10.1 Zugriff auf Namespaces
Pfeil 3.10.2 Die »using«-Direktive
Pfeil 3.10.3 Globaler Namespace
Pfeil 3.10.4 Vermeiden von Mehrdeutigkeiten
Pfeil 3.10.5 Namespaces festlegen
Pfeil 3.10.6 Der »::«-Operator
Pfeil 3.10.7 Unterstützung von Visual Studio 2012 bei den Namespaces
Pfeil 3.11 Stand der Klasse »Circle«

Galileo Computing - Zum Seitenanfang

3.2 Die KlassendefinitionZur nächsten Überschrift


Galileo Computing - Zum Seitenanfang

3.2.1 Klassen im Visual Studio anlegenZur nächsten ÜberschriftZur vorigen Überschrift

Eine Klasse ist die grundlegendste Einheit in der objektorientierten Programmierung und dient dazu, einen Datentyp zu definieren. Starten Sie ein neues Projekt vom Typ Konsolenanwendung, ist die Struktur einer Klasse (Program) bereits vordefiniert. Der Quellcode befindet sich in einer Datei mit der Dateierweiterung .cs. Dateiname und Klassenbezeichner sind per Vorgabe identisch, müssen es aber nicht sein. In einer Quellcodedatei können Sie durchaus mehrere Klassen definieren, was allerdings nicht empfehlenswert ist, weil darunter die Übersicht leidet.

Möchten Sie eine zusätzliche Klasse in einer eigenen Quellcodedatei implementieren, haben Sie zwei Alternativen:

  • Sie wählen im Menü Projekt der Entwicklungsumgebung das Untermenü Klasse hinzufügen...
  • Sie öffnen mit der rechten Maustaste das Kontextmenü des Projekts im Projektmappen-Explorer, wählen Hinzufügen und danach aus der sich anschließend öffnenden Liste Klasse hinzufügen...

Daraufhin öffnet sich das Dialogfenster Neues Element hinzufügen, in dem die Vorlage Klasse bereits vorselektiert ist. Sie sollten einen möglichst beschreibenden Klassennamen wählen, der auch gleichzeitig zum Namen der Quellcodedatei wird. Wenn Sie wollen, können Sie später sowohl die Klasse als auch die Quellcodedatei umbenennen.

Zur Bezeichnung von Klassen gibt es Konventionen, an denen Sie sich orientieren sollten:

  • Der erste Buchstabe sollte großgeschrieben werden. Setzt sich der Bezeichner einer Klasse aus mehreren einzelnen Begriffen zusammen, wird empfohlen, zur besseren Lesbarkeit jeden Begriff mit einem Großbuchstaben zu beginnen.
  • Ein Klassenbezeichner sollte nicht dadurch kenntlich gemacht werden, dass ihm ein »C« oder ein anderes Präfix vorangestellt wird, wie es in anderen objektorientierten Sprachen teilweise üblich ist.

Erscheint Ihnen der Name der Quellcodedatei zu einem späteren Zeitpunkt unpassend, können Sie

  • im Projektmappen-Explorer das Kontextmenü der entsprechenden Datei öffnen, Umbenennen wählen und den neuen Namen eingeben oder
  • im Projektmappen-Explorer die umzubenennende Datei selektieren und im Eigenschaftenfenster unter Dateiname den neuen Namen eintragen.

Galileo Computing - Zum Seitenanfang

3.2.2 Das Projekt »GeometricObjectsSolution«Zur nächsten ÜberschriftZur vorigen Überschrift

Wir wollen an dieser Stelle mit einem Projekt beginnen, das uns über viele Kapitel dieses Buches hinweg begleiten wird. Nach und nach wird das Projekt ergänzt und erweitert, und am Ende werden nahezu alle objektorientierten Features von .NET in den zu diesem Projekt gehörenden Klassen enthalten sein. Bei den Klassen handelt es sich um die syntaktischen Beschreibungen geometrischer Objekte wie zum Beispiel um die eines Kreises und eines Rechtecks. Am Ende werden wir feststellen, dass die entwickelten Klassen nicht nur in einer Konsolenanwendung sinnvoll einzusetzen sind, sondern auch anderen Anwendungen als Bibliothek zur Verfügung gestellt werden können. Mit anderen Worten: Wir werden am Ende aus der ursprünglichen Konsolenanwendung eine Klassenbibliothek machen.

In einer laufenden Instanz von Visual Studio 2012 können Sie gleichzeitig mehrere Projekte bearbeiten. Diese können miteinander in Beziehung stehen (beispielsweise bei einer Client-Server-Lösung), müssen es aber nicht zwangsläufig. Alle Projekte werden von einer sogenannten Projektmappe verwaltet, die die Anwendungen einer laufenden Visual-Studio-Instanz in einer SLN-Datei regelrecht zusammenschraubt. Die Dateierweiterung SLN steht dabei für »Solution«. Die Projektmappe wird im Dateisystem durch einen Ordner beschrieben, in dem alle zu der Projektmappe gehörenden Projekte als Unterordner enthalten sind.

Wir wollen nun mit dem angekündigten Projekt starten, das als Konsolenanwendung bereitgestellt wird. Das Projekt sollte GeometricObjects lauten. Zudem können Sie bereits beim Anlegen des Projekts eine Projektmappe bereitstellen und dieser einen passenden Namen geben. In unserem Beispiel sollte sie GeometricObjectsSolution heißen.

Wie angedeutet, wird uns das Projekt GeometricObjects über viele Kapitel dieses Buches begleiten. Um die einzelnen Versionen unterscheiden zu können, bekommen die Projektmappenbezeichner einen Zähler angehängt.

Abbildung

Abbildung 3.1 Anlegen einer neuen Projektmappe

Nachdem wir die Projektmappe GeometricObjectsSolution mit der Konsolenanwendung GeometricObjects angelegt haben, wollen wir uns der ersten Klasse widmen, die Circle heißen soll. Markieren Sie dazu das Projekt GeometricObjects im Projektmappen-Explorer, öffnen Sie das Kontextmenü, und wählen Sie Hinzufügen Klasse ... Tragen Sie den Namen der Datei im sich daraufhin öffnenden Dialog ein (Circle.cs), und bestätigen Sie die Angaben. Das Projekt ist danach um die Klasse Circle erweitert worden, weil der Dateibezeichner automatisch als neuer Bezeichner der Klasse verwendet wird. Dass Datei und Klasse den gleichen Namen haben, ist aber keine Notwendigkeit.

Die neue Klasse hat die folgende Struktur:

namespace GeometricObjects
{
class
Circle
{
}
}

Weil die Klasse später in Form einer Klassenbibliothek veröffentlicht werden soll, empfiehlt es sich, die Klasse um den Zugriffsmodifizierer public zu ergänzen, also:

public class Circle 

Sollte in der laufenden Instanz von Visual Studio 2012 die Projektmappe im Projektmappen-Explorer nicht zu sehen sein, können Sie das unter Extras Optionen einstellen (siehe Abbildung 3.2).

Abbildung

Abbildung 3.2 Einstellung zur Anzeige der Projektmappe


Galileo Computing - Zum Seitenanfang

3.2.3 Die Deklaration von ObjektvariablenZur nächsten ÜberschriftZur vorigen Überschrift

Eine Klassendefinition beschreibt den Bauplan eines Objekts und gilt als Typdefinition. Um ein Objekt eines bestimmten Typs zu erzeugen, muss zunächst für jedes Objekt eine Objektvariable deklariert werden, beispielsweise:

Circle kreis;

Eine Objektvariable verweist auf einen Speicherbereich. Man sagt daher auch, dass eine Objektvariable ein Objekt referenziert, und spricht bei einer Objektvariablen von einer Instanz oder von einer Referenz. Tatsächlich ist unter einer Referenz ein Zeiger auf die Startadresse des Speicherbereichs zu verstehen, der alle Zustandsdaten enthält. Zustandsdaten sind die Eigenschaften, die das Objekt von einem anderen Objekt desselben Typs unterscheiden.

Bei der Deklaration der Objektvariablen kreis wird der für das Objekt erforderliche Speicher angefordert, aber ein konkretes Objekt existiert noch nicht, denn die Objektvariable ist noch nicht initialisiert. Zur Initialisierung einer Objektvariablen bieten sich zwei gleichwertige Alternativen an:

  • die zweizeilige Variante:
    Circle kreis;
    kreis = new Circle();
  • die kürzere, einzeilige Schreibweise:
    Circle kreis = new Circle();

Beide weisen ein gemeinsames Merkmal auf: den Operator new, der für die Konkretisierung eines Objekts verantwortlich ist. Erst mit new beginnt die Existenz des Objekts. Dahinter verbirgt sich der Aufruf einer ganz bestimmten Methode, die als Konstruktor bezeichnet wird. Wir werden uns weiter unten damit noch beschäftigen.

Sie können in einer Anweisung auch mehrere Variablen desselben Typs deklarieren. Dazu werden die Objektvariablen hintereinandergeschrieben und durch ein Komma voneinander getrennt:

Circle kreis1, kreis2, kreis3;

Der C#-Compiler erlaubt auch die folgende Anweisung:

Circle kreis1, kreis2, kreis3 = new Circle();

Allerdings wird nur die zuletzt angegebene Objektvariable kreis3 initialisiert. kreis1 und kreis2 gelten nur als deklariert und müssen gegebenenfalls zu einem späteren Zeitpunkt noch mit

kreis1 = new Circle();
kreis2 = new Circle();

initialisiert werden.


Galileo Computing - Zum Seitenanfang

3.2.4 Zugriffsmodifizierer einer KlasseZur nächsten ÜberschriftZur vorigen Überschrift

Entwickeln Sie eine neue Klasse, müssen Sie einem Umstand besondere Beachtung schenken: Entwerfen Sie die Klasse, um sie ausschließlich in der Anwendung zu verwenden, in der die Klasse definiert ist, oder beabsichtigen Sie, die Klasse auch anderen Anwendungen zur Verfügung zu stellen? Diese Sichtbarkeit wird durch Zugriffsmodifizierer beschrieben. Bei Klassen spielen nur zwei eine Rolle: public und internal.

Tabelle 3.1 Die Zugriffsmodifizierer einer Klasse

Modifizierer Beschreibung

public

Die Instanziierbarkeit einer öffentlichen Klasse unterliegt keinerlei Beschränkungen. Die Klasse kann dann auch aus anderen Anwendungen heraus instanziiert werden. Auswirkungen kann dieser Zugriffsmodifizierer nur dann zeigen, wenn die Klasse innerhalb einer Klassenbibliothek codiert wird.

internal

Beabsichtigen Sie, die Sichtbarkeit einer Klasse auf die Anwendung zu beschränken, in der die Klasse definiert ist, müssen Sie die Klasse internal deklarieren. Aus einer anderen Anwendung heraus kann dann kein Objekt dieser Klasse erzeugt werden.

Die Angabe des Zugriffsmodifizierers ist optional. Verzichten Sie darauf, gilt die Klasse als internal.


Galileo Computing - Zum Seitenanfang

3.2.5 Splitten einer Klassendefinition mit »partial«Zur nächsten ÜberschriftZur vorigen Überschrift

Klassendefinitionen in .NET lassen sich über mehrere Quellcodedateien verteilen. Diese Programmiertechnik erlaubt es mehreren Entwicklern, gleichzeitig an der gleichen Klasse zu arbeiten. Das Prinzip der partiellen Klassen wird auch von der Entwicklungsumgebung bei einigen Projektvorlagen genutzt, denn durch die Aufteilung des Klassencodes lässt sich der von Visual Studio automatisch generierte Code von dem Code, den der Entwickler schreibt, sauber trennen. Das verschafft nicht nur einen besseren Überblick über den eigenen Code, sondern reduziert auch potenzielle Probleme, die auftreten können, wenn der automatisch erzeugte Code vom Entwickler verändert werden sollte.

Partielle Klassendefinitionen sind dadurch gekennzeichnet, dass man den Modifizierer partial vor alle Teildefinitionen setzt. Die Signatur muss in jeder Teildefinition natürlich identisch sein. Nehmen wir beispielsweise an, Sie möchten die Klasse Circle auf die beiden Quellcodedateien Circle1.cs und Circle2.cs aufteilen. Dann müssten die Klassendefinitionen wie folgt lauten:

// in der Quellcodedatei 'Circle1.cs'

partial class Circle {
[...]
}

// in der Quellcodedatei 'Circle2.cs'

partial class Circle {
[...]
}

Listing 3.5 Partielle Klassendefinition

Eine Einschränkung des Gebrauchs partieller Typen müssen Sie jedoch beachten: Alle Klassenfragmente müssen sich in derselben Anwendung befinden.


Galileo Computing - Zum Seitenanfang

3.2.6 Arbeiten mit ObjektreferenzenZur nächsten ÜberschriftZur vorigen Überschrift

Prüfen auf Initialisierung

Eine Objektvariable gilt als initialisiert, wenn sie auf ein konkretes Objekt zeigt oder den Wert null beschreibt. Verwechseln Sie null nicht mit der Zahl »0«. null gibt an, dass eine Variable zwar initialisiert ist, aber kein konkretes Objekt referenziert. Mit

Circle kreis;

wird zwar eine Objektvariable deklariert, sie ist aber noch nicht initialisiert und hat auch nicht den Zustand null. Sehen wir uns an, was passiert, wenn wir eine Objektvariable deklarieren und anschließend ohne vorhergehende Initialisierung auf null testen.

class Program {
static void Main(string[] args) {
Circle kreis;
if (kreis == null) {

// die Variable "kreis" referenziert kein Objekt

Console.WriteLine("Das Objekt existiert nicht!");
kreis = new Circle();
}
else

// "kreis" ist eine gültige Objektreferenz

Console.WriteLine("Das Objekt existiert");

// weitere Anweisungen

Console.ReadLine();
}
}

Listing 3.6 Prüfen einer Referenz auf »null« (führt zu einem Fehler)

Der C#-Compiler ist intelligent genug, um zu erkennen, dass die Objektreferenz kreis vor ihrer Prüfung im if-Statement zu keinem Zeitpunkt initialisiert worden ist, und bricht die Kompilierung mit einer Fehlermeldung ab.

Eine initialisierte Objektvariable liegt immer dann vor, wenn Sie ihr null zuweisen oder mit new ein neues Objekt erzeugen. Somit wird mit den beiden folgenden Anweisungen eine Objektvariable initialisiert:

Circle kreis = null;

Circle kreis = new Circle();

Eine Objektvariable kann nur benutzt werden, wenn sie initialisiert ist. Objekteigenschaften oder Objektmethoden lassen sich allerdings nur dann aufrufen, wenn sich hinter einer initialisierten Objektvariablen auch tatsächlich ein Objekt verbirgt und nicht null. Ist man sich über den Zustand der Variablen im Unklaren, muss dieser, wie im folgenden Codefragment gezeigt, überprüft werden:

if(kreis == null)

// die Variable "kreis" referenziert kein konkretes Objekt

else

// "kreis" ist ein gültiges Objekt

Ebenso gut können Sie auch mit

if(kreis != null) [...]

prüfen, ob kreis ein gültiger Objektverweis ist.

Freigabe eines Objekts

Objekte beanspruchen den Speicher. Sie sollten daher ein Objekt freigeben, wenn Sie es nicht mehr benötigen. Dazu weisen Sie der Objektvariablen null zu, wie im folgenden Codefragment zu sehen ist:

Circle kreis = new Circle();
[...]
kreis = null;

Nun steht Ihnen das Objekt kreis nicht mehr zur Verfügung. Allerdings ist die Annahme falsch, dass das Objekt nun auch im Speicher gelöscht ist. Tatsächlich existiert es dort weiter, Sie können es nur nicht mehr aus dem Code heraus ansprechen. Zu einem späteren Zeitpunkt wird ein Mechanismus, die Garbage Collection, alle nicht mehr referenzierten Objekte im Speicher erfassen, und der von ihnen beanspruchte Speicherplatz wird wieder freigeben. So wird es auch dem Objekt kreis ergehen. Auf die Garbage Collection kommen wir in Kapitel 4 detailliert zu sprechen.

Mehrere Referenzen auf ein Objekt

Es kommt häufiger vor, dass mehrere Referenzen auf dasselbe Objekt zeigen. Betrachten Sie dazu das folgende Listing:

Circle kreis1 = new Circle();
Circle kreis2 = kreis1;

Listing 3.7 Ein Objekt mit zwei Referenzen

Zuerst wird die Variable kreis1 vom Typ Circle deklariert und initialisiert. Anschließend wird kreis1 der Variablen kreis2 zugewiesen. Trotz zwei namentlich unterschiedlicher Referenzen liegt nur ein konkretes Objekt vor, das sowohl über kreis1 als auch über kreis2 angesprochen werden kann.

Wenn Sie einem Feld über eine der beiden Referenzen einen Wert zuweisen, beispielsweise mit

kreis1.Radius = 10

können Sie auch mit der zweiten Objektreferenz den Inhalt der Eigenschaft auswerten:

Console.WriteLine(kreis2.Radius)

An der Konsole wird »10« angezeigt, da kreis2 dasselbe Objekt referenziert wie kreis1. Wird ein Objekt mehrfach referenziert, spielt es demnach keine Rolle, über welche Referenz der Eigenschaft ein Wert zugewiesen bzw. ein Feld ausgelesen wird – die Operation wird auf demselben Objekt ausgeführt.

Geben Sie eine der Referenzen mit null frei, können Sie über die zweite Referenz das Objekt immer noch ansprechen, z. B.:

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

Listing 3.8 Objekt nach der Freigabe einer Referenz mit »null«

An der Konsole wird immer noch der Inhalt der Eigenschaft Radius ausgegeben, also 20. Erst mit der Freigabe der letzten gültigen Referenz auf ein Objekt wird dieses tatsächlich unwiederbringlich freigegeben.



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# 2012

Visual C# 2012
Jetzt bestellen


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

 Buchempfehlungen
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


Zum Katalog: C/C++






 C/C++


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo





Copyright © Rheinwerk Verlag GmbH 2013
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.


[Rheinwerk Computing]

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