Doberenz / Gewinnus / Saumweber | Visual C# 2017 – Grundlagen, Profiwissen und Rezepte | E-Book | sack.de
E-Book

E-Book, Deutsch, 951 Seiten

Doberenz / Gewinnus / Saumweber Visual C# 2017 – Grundlagen, Profiwissen und Rezepte


1. Auflage 2018
ISBN: 978-3-446-45370-8
Verlag: Carl Hanser
Format: PDF
Kopierschutz: 1 - PDF Watermark

E-Book, Deutsch, 951 Seiten

ISBN: 978-3-446-45370-8
Verlag: Carl Hanser
Format: PDF
Kopierschutz: 1 - PDF Watermark



Dieser Klassiker der C#-/.NET-Programmierung bietet Ihnen Know-how und zahlreiche Rezepte, mit denen Sie häufig auftretende Probleme meistern. Einsteiger erhalten ein umfangreiches Tutorial zu den Grundlagen der C#-Programmierung mit Visual Studio 2017, dem Profi liefert es fortgeschrittene Programmiertechniken zu allen wesentlichen Einsatzgebieten der Windows-Programmierung. Zum sofortigen Ausprobieren finden Sie am Ende eines jeden Kapitels hochwertige Lösungen für nahezu jedes Problem.
Mit diesem Buch haben Sie den idealen Begleiter für Ihre tägliche Arbeit und zugleich - dank der erfrischenden und unterhaltsamen Sprache - eine spannende Lektüre, die Lust macht, auch Projekte in der Freizeit umzusetzen.
Das Buch gliedert sich in einen Grundlagenteil zur Programmierung mit Visual Studio 2017 und C# 7.0 und einen Technologieteil zu fortgeschrittenen Themen.
Im Internet finden Sie darüber hinaus zum Download Beispiele und Bonuskapitel zu Windows Presentation Foundation (WPF) und Windows Forms-Anwendungen.

Walter Saumweber hat langjährige Erfahrung als Entwickler, Berater und Dozent. Er ist Autor von zahlreichen Fachbüchern und Beiträgen in Computer-Fachzeitschriften und -Onlineportalen.
Doberenz / Gewinnus / Saumweber Visual C# 2017 – Grundlagen, Profiwissen und Rezepte jetzt bestellen!

Weitere Infos & Material


1;Inhalt;7
2;Vorwort;23
3;TEIL I: Grundlagen;27
3.1;1 Einstieg in Visual Studio 2017;29
3.1.1;1.1 Die Installation von Visual Studio 2017;29
3.1.1.1;1.1.1 Überblick über die Produktpalette;29
3.1.1.2;1.1.2 Anforderungen an Hard- und Software;30
3.1.2;1.2 Unser allererstes C#-Programm;31
3.1.2.1;1.2.1 Vorbereitungen;31
3.1.2.2;1.2.2 Quellcode schreiben;33
3.1.2.3;1.2.3 Programm kompilieren und testen;33
3.1.2.4;1.2.4 Einige Erläuterungen zum Quellcode;34
3.1.2.5;1.2.5 Konsolenanwendungen sind out;35
3.1.3;1.3 Die Windows-Philosophie;36
3.1.3.1;1.3.1 Mensch-Rechner-Dialog;36
3.1.3.2;1.3.2 Objekt- und ereignisorientierte Programmierung;36
3.1.3.3;1.3.3 Programmieren mit Visual Studio 2017;38
3.1.4;1.4 Die Entwicklungsumgebung Visual Studio 2017;39
3.1.4.1;1.4.1 Neues Projekt;39
3.1.4.2;1.4.2 Die wichtigsten Fenster;40
3.1.5;1.5 Microsofts .NET-Technologie;44
3.1.5.1;1.5.1 Zur Geschichte von .NET;44
3.1.5.2;1.5.2 .NET-Features und Begriffe;46
3.1.6;1.6 Praxisbeispiele;54
3.1.6.1;1.6.1 Unsere erste Windows-Forms-Anwendung;54
3.1.6.2;1.6.2 Umrechnung Euro-Dollar;58
3.2;2 Grundlagen der Sprache C#;67
3.2.1;2.1 Grundbegriffe;67
3.2.1.1;2.1.1 Anweisungen;67
3.2.1.2;2.1.2 Bezeichner;68
3.2.1.3;2.1.3 Schlüsselwörter;69
3.2.1.4;2.1.4 Kommentare;70
3.2.2;2.2 Datentypen, Variablen und Konstanten;71
3.2.2.1;2.2.1 Fundamentale Typen;71
3.2.2.2;2.2.2 Wertetypen versus Verweistypen;72
3.2.2.3;2.2.3 Benennung von Variablen;73
3.2.2.4;2.2.4 Deklaration von Variablen;73
3.2.2.5;2.2.5 Typsuffixe;75
3.2.2.6;2.2.6 Zeichen und Zeichenketten;75
3.2.2.7;2.2.7 object-Datentyp;78
3.2.2.8;2.2.8 Konstanten deklarieren;79
3.2.2.9;2.2.9 Nullable Types;79
3.2.2.10;2.2.10 Typinferenz;80
3.2.2.11;2.2.11 Gültigkeitsbereiche und Sichtbarkeit;81
3.2.3;2.3 Konvertieren von Datentypen;82
3.2.3.1;2.3.1 Implizite und explizite Konvertierung;82
3.2.3.2;2.3.2 Welcher Datentyp passt zu welchem?;84
3.2.3.3;2.3.3 Konvertieren von string;84
3.2.3.4;2.3.4 Die Convert-Klasse;87
3.2.3.5;2.3.5 Die Parse-Methode;87
3.2.3.6;2.3.6 Boxing und Unboxing;88
3.2.4;2.4 Operatoren;89
3.2.4.1;2.4.1 Arithmetische Operatoren;90
3.2.4.2;2.4.2 Zuweisungsoperatoren;92
3.2.4.3;2.4.3 Logische Operatoren;93
3.2.4.4;2.4.4 Rangfolge der Operatoren;95
3.2.5;2.5 Kontrollstrukturen;97
3.2.5.1;2.5.1 Verzweigungsbefehle;97
3.2.5.2;2.5.2 Schleifenanweisungen;100
3.2.6;2.6 Benutzerdefinierte Datentypen;103
3.2.6.1;2.6.1 Enumerationen;103
3.2.6.2;2.6.2 Strukturen;105
3.2.7;2.7 Nutzerdefinierte Methoden;107
3.2.7.1;2.7.1 Methoden mit Rückgabewert;108
3.2.7.2;2.7.2 Methoden ohne Rückgabewert;109
3.2.7.3;2.7.3 Parameterübergabe mit ref;110
3.2.7.4;2.7.4 Parameterübergabe mit out;111
3.2.7.5;2.7.5 Methodenüberladung;112
3.2.7.6;2.7.6 Optionale Parameter;113
3.2.7.7;2.7.7 Benannte Parameter;115
3.2.8;2.8 Praxisbeispiele;116
3.2.8.1;2.8.1 Vom PAP zur Konsolenanwendung;116
3.2.8.2;2.8.2 Ein Konsolen- in ein Windows-Programm verwandeln;118
3.2.8.3;2.8.3 Schleifenanweisungen verstehen;120
3.2.8.4;2.8.4 Benutzerdefinierte Methoden überladen;122
3.2.8.5;2.8.5 Anwendungen von Visual Basic nach C# portieren;125
3.3;3 OOP-Konzepte;133
3.3.1;3.1 Kleine Einführung in die OOP;133
3.3.1.1;3.1.1 Historische Entwicklung;134
3.3.1.2;3.1.2 Grundbegriffe der OOP;135
3.3.1.3;3.1.3 Sichtbarkeit von Klassen und ihren Mitgliedern;137
3.3.1.4;3.1.4 Allgemeiner Aufbau einer Klasse;138
3.3.1.5;3.1.5 Das Erzeugen eines Objekts;140
3.3.1.6;3.1.6 Einführungsbeispiel;143
3.3.2;3.2 Eigenschaften;147
3.3.2.1;3.2.1 Eigenschaften mit Zugriffsmethoden kapseln;147
3.3.2.2;3.2.2 Berechnete Eigenschaften;149
3.3.2.3;3.2.3 Lese-/Schreibschutz;151
3.3.2.4;3.2.4 Property-Accessoren;152
3.3.2.5;3.2.5 Statische Felder/Eigenschaften;152
3.3.2.6;3.2.6 Einfache Eigenschaften automatisch implementieren;155
3.3.3;3.3 Methoden;156
3.3.3.1;3.3.1 Öffentliche und private Methoden;156
3.3.3.2;3.3.2 Überladene Methoden;157
3.3.3.3;3.3.3 Statische Methoden;158
3.3.4;3.4 Ereignisse;160
3.3.4.1;3.4.1 Ereignis hinzufügen;160
3.3.4.2;3.4.2 Ereignis verwenden;163
3.3.5;3.5 Arbeiten mit Konstruktor und Destruktor;166
3.3.5.1;3.5.1 Konstruktor und Objektinitialisierer;167
3.3.5.2;3.5.2 Destruktor und Garbage Collector;170
3.3.5.3;3.5.3 Mit using den Lebenszyklus des Objekts kapseln;172
3.3.5.4;3.5.4 Verzögerte Initialisierung;173
3.3.6;3.6 Vererbung und Polymorphie;174
3.3.6.1;3.6.1 Klassendiagramm;174
3.3.6.2;3.6.2 Method-Overriding;175
3.3.6.3;3.6.3 Klassen implementieren;175
3.3.6.4;3.6.4 Implementieren der Objekte;179
3.3.6.5;3.6.5 Ausblenden von Mitgliedern durch Vererbung;180
3.3.6.6;3.6.6 Allgemeine Hinweise und Regeln zur Vererbung;182
3.3.6.7;3.6.7 Polymorphes Verhalten;183
3.3.6.8;3.6.8 Die Rolle von System.Object;186
3.3.7;3.7 Spezielle Klassen;187
3.3.7.1;3.7.1 Abstrakte Klassen;187
3.3.7.2;3.7.2 Versiegelte Klassen;189
3.3.7.3;3.7.3 Partielle Klassen;189
3.3.7.4;3.7.4 Statische Klassen;191
3.3.8;3.8 Schnittstellen (Interfaces);191
3.3.8.1;3.8.1 Definition einer Schnittstelle;192
3.3.8.2;3.8.2 Implementieren einer Schnittstelle;192
3.3.8.3;3.8.3 Abfragen, ob Schnittstelle vorhanden ist;193
3.3.8.4;3.8.4 Mehrere Schnittstellen implementieren;194
3.3.8.5;3.8.5 Schnittstellenprogrammierung ist ein weites Feld ...;194
3.3.9;3.9 Praxisbeispiele;195
3.3.9.1;3.9.1 Eigenschaften sinnvoll kapseln;195
3.3.9.2;3.9.2 Eine statische Klasse anwenden;198
3.3.9.3;3.9.3 Vom fetten zum schlanken Client;200
3.3.9.4;3.9.4 Schnittstellenvererbung verstehen;210
3.3.9.5;3.9.5 Rechner für komplexe Zahlen;215
3.3.9.6;3.9.6 Sortieren mit IComparable/IComparer;224
3.3.9.7;3.9.7 Einen Objektbaum in generischen Listen abspeichern;228
3.3.9.8;3.9.8 OOP beim Kartenspiel erlernen;234
3.3.9.9;3.9.9 Eine Klasse zur Matrizenrechnung entwickeln;239
3.4;4 Arrays, Strings, Funktionen;245
3.4.1;4.1 Datenfelder (Arrays);245
3.4.1.1;4.1.1 Array deklarieren;246
3.4.1.2;4.1.2 Array instanziieren;246
3.4.1.3;4.1.3 Array initialisieren;247
3.4.1.4;4.1.4 Zugriff auf Array-Elemente;248
3.4.1.5;4.1.5 Zugriff mittels Schleife;249
3.4.1.6;4.1.6 Mehrdimensionale Arrays;250
3.4.1.7;4.1.7 Zuweisen von Arrays;252
3.4.1.8;4.1.8 Arrays aus Strukturvariablen;253
3.4.1.9;4.1.9 Löschen und Umdimensionieren von Arrays;254
3.4.1.10;4.1.10 Eigenschaften und Methoden von Arrays;255
3.4.1.11;4.1.11 Übergabe von Arrays;257
3.4.2;4.2 Verarbeiten von Zeichenketten;258
3.4.2.1;4.2.1 Zuweisen von Strings;258
3.4.2.2;4.2.2 Eigenschaften und Methoden von String-Variablen;259
3.4.2.3;4.2.3 Wichtige Methoden der String-Klasse;262
3.4.2.4;4.2.4 Die StringBuilder-Klasse;264
3.4.3;4.3 Reguläre Ausdrücke;267
3.4.3.1;4.3.1 Wozu werden reguläre Ausdrücke verwendet?;267
3.4.3.2;4.3.2 Eine kleine Einführung;267
3.4.3.3;4.3.3 Wichtige Methoden/Eigenschaften der Klasse Regex;268
3.4.3.4;4.3.4 Kompilierte reguläre Ausdrücke;270
3.4.3.5;4.3.5 RegexOptions-Enumeration;271
3.4.3.6;4.3.6 Metazeichen (Escape-Zeichen);272
3.4.3.7;4.3.7 Zeichenmengen (Character Sets);273
3.4.3.8;4.3.8 Quantifizierer;275
3.4.3.9;4.3.9 Zero-Width Assertions;276
3.4.3.10;4.3.10 Gruppen;280
3.4.3.11;4.3.11 Text ersetzen;280
3.4.3.12;4.3.12 Text splitten;281
3.4.4;4.4 Datums- und Zeitberechnungen;282
3.4.4.1;4.4.1 Die DateTime-Struktur;282
3.4.4.2;4.4.2 Wichtige Eigenschaften von DateTime-Variablen;284
3.4.4.3;4.4.3 Wichtige Methoden von DateTime-Variablen;284
3.4.4.4;4.4.4 Wichtige Mitglieder der DateTime-Struktur;285
3.4.4.5;4.4.5 Konvertieren von Datumstrings in DateTime-Werte;286
3.4.4.6;4.4.6 Die TimeSpan-Struktur;287
3.4.5;4.5 Mathematische Funktionen;289
3.4.5.1;4.5.1 Überblick;289
3.4.5.2;4.5.2 Zahlen runden;289
3.4.5.3;4.5.3 Winkel umrechnen;290
3.4.5.4;4.5.4 Potenz- und Wurzeloperationen;290
3.4.5.5;4.5.5 Logarithmus und Exponentialfunktionen;290
3.4.5.6;4.5.6 Zufallszahlen erzeugen;291
3.4.6;4.6 Zahlen- und Datumsformatierungen;292
3.4.6.1;4.6.1 Anwenden der ToString-Methode;292
3.4.6.2;4.6.2 Anwenden der Format-Methode;294
3.4.6.3;4.6.3 Stringinterpolation;295
3.4.7;4.7 Praxisbeispiele;296
3.4.7.1;4.7.1 Zeichenketten verarbeiten;296
3.4.7.2;4.7.2 Zeichenketten mit StringBuilder addieren;299
3.4.7.3;4.7.3 Reguläre Ausdrücke testen;303
3.4.7.4;4.7.4 Methodenaufrufe mit Array-Parametern;304
3.5;5 Weitere Sprachfeatures;309
3.5.1;5.1 Namespaces (Namensräume);309
3.5.1.1;5.1.1 Ein kleiner Überblick;309
3.5.1.2;5.1.2 Einen eigenen Namespace einrichten;310
3.5.1.3;5.1.3 Die using-Anweisung;311
3.5.1.4;5.1.4 Namespace Alias;312
3.5.2;5.2 Operatorenüberladung;313
3.5.2.1;5.2.1 Syntaxregeln;313
3.5.2.2;5.2.2 Praktische Anwendung;313
3.5.3;5.3 Collections (Auflistungen);314
3.5.3.1;5.3.1 Die Schnittstelle IEnumerable;315
3.5.3.2;5.3.2 ArrayList;317
3.5.3.3;5.3.3 Hashtable;319
3.5.3.4;5.3.4 Indexer;319
3.5.4;5.4 Generics;322
3.5.4.1;5.4.1 Klassische Vorgehensweise;322
3.5.4.2;5.4.2 Generics bieten Typsicherheit;324
3.5.4.3;5.4.3 Generische Methoden;325
3.5.4.4;5.4.4 Iteratoren;326
3.5.5;5.5 Generische Collections;327
3.5.5.1;5.5.1 List-Collection statt ArrayList;327
3.5.5.2;5.5.2 Vorteile generischer Collections;328
3.5.5.3;5.5.3 Constraints;328
3.5.6;5.6 Das Prinzip der Delegates;329
3.5.6.1;5.6.1 Delegates sind Methodenzeiger;329
3.5.6.2;5.6.2 Einen Delegate-Typ deklarieren;329
3.5.6.3;5.6.3 Ein Delegate-Objekt erzeugen;330
3.5.6.4;5.6.4 Delegates vereinfacht instanziieren;332
3.5.6.5;5.6.5 Anonyme Methoden;332
3.5.6.6;5.6.6 Lambda-Ausdrücke;334
3.5.6.7;5.6.7 Lambda-Ausdrücke in der Task Parallel Library;336
3.5.7;5.7 Dynamische Programmierung;338
3.5.7.1;5.7.1 Wozu dynamische Programmierung?;338
3.5.7.2;5.7.2 Das Prinzip der dynamischen Programmierung;338
3.5.7.3;5.7.3 Optionale Parameter sind hilfreich;341
3.5.7.4;5.7.4 Kovarianz und Kontravarianz;342
3.5.8;5.8 Weitere Datentypen;343
3.5.8.1;5.8.1 BigInteger;343
3.5.8.2;5.8.2 Complex;345
3.5.8.3;5.8.3 Tuple<>;346
3.5.8.4;5.8.4 SortedSet<>;347
3.5.9;5.9 Praxisbeispiele;348
3.5.9.1;5.9.1 ArrayList versus generische List;348
3.5.9.2;5.9.2 Generische IEnumerable-Interfaces implementieren;351
3.5.9.3;5.9.3 Delegates, anonyme Methoden, Lambda Expressions;355
3.5.9.4;5.9.4 Dynamischer Zugriff auf COM Interop;359
3.6;6 Einführung in LINQ;363
3.6.1;6.1 LINQ-Grundlagen;363
3.6.1.1;6.1.1 Die LINQ-Architektur;363
3.6.1.2;6.1.2 Anonyme Typen;365
3.6.1.3;6.1.3 Erweiterungsmethoden;366
3.6.2;6.2 Abfragen mit LINQ to Objects;367
3.6.2.1;6.2.1 Grundlegendes zur LINQ-Syntax;368
3.6.2.2;6.2.2 Zwei alternative Schreibweisen von LINQ-Abfragen;369
3.6.2.3;6.2.3 Übersicht der wichtigsten Abfrageoperatoren;370
3.6.3;6.3 LINQ-Abfragen im Detail;371
3.6.3.1;6.3.1 Die Projektionsoperatoren Select und SelectMany;372
3.6.3.2;6.3.2 Der Restriktionsoperator Where;374
3.6.3.3;6.3.3 Die Sortierungsoperatoren OrderBy und ThenBy;374
3.6.3.4;6.3.4 Der Gruppierungsoperator GroupBy;376
3.6.3.5;6.3.5 Verknüpfen mit Join;378
3.6.3.6;6.3.6 Aggregat-Operatoren;379
3.6.3.7;6.3.7 Verzögertes Ausführen von LINQ-Abfragen;381
3.6.3.8;6.3.8 Konvertierungsmethoden;382
3.6.3.9;6.3.9 Abfragen mit PLINQ;383
3.6.4;6.4 Praxisbeispiele;386
3.6.4.1;6.4.1 Die Syntax von LINQ-Abfragen verstehen;386
3.6.4.2;6.4.2 Aggregat-Abfragen mit LINQ;389
3.6.4.3;6.4.3 LINQ im Schnelldurchgang erlernen;391
3.6.4.4;6.4.4 Strings mit LINQ abfragen und filtern;394
3.6.4.5;6.4.5 Duplikate aus einer Liste oder einem Array entfernen;395
3.6.4.6;6.4.6 Arrays mit LINQ initialisieren;398
3.6.4.7;6.4.7 Arrays per LINQ mit Zufallszahlen füllen;400
3.6.4.8;6.4.8 Einen String mit Wiederholmuster erzeugen;402
3.6.4.9;6.4.9 Mit LINQ Zahlen und Strings sortieren;403
3.6.4.10;6.4.10 Mit LINQ Collections von Objekten sortieren;404
3.6.4.11;6.4.11 Ergebnisse von LINQ-Abfragen in ein Array kopieren;407
3.7;7 C#-Sprachneuerungen im Überblick;409
3.7.1;7.1 C# 4.0 – Visual Studio 2010;409
3.7.1.1;7.1.1 Datentyp dynamic;409
3.7.1.2;7.1.2 Benannte und optionale Parameter;410
3.7.1.3;7.1.3 Covarianz und Contravarianz;412
3.7.2;7.2 C# 5.0 – Visual Studio 2012;412
3.7.2.1;7.2.1 Async und Await;412
3.7.2.2;7.2.2 CallerInfo;412
3.7.3;7.3 Visual Studio 2013;413
3.7.4;7.4 C# 6.0 – Visual Studio 2015;413
3.7.4.1;7.4.1 String Interpolation;413
3.7.4.2;7.4.2 Schreibgeschützte AutoProperties;413
3.7.4.3;7.4.3 Initialisierer für AutoProperties;414
3.7.4.4;7.4.4 Expression Body Funktionsmember;414
3.7.4.5;7.4.5 using static;414
3.7.4.6;7.4.6 Bedingter Nulloperator;415
3.7.4.7;7.4.7 Ausnahmenfilter;415
3.7.4.8;7.4.8 nameof-Ausdrücke;416
3.7.4.9;7.4.9 await in catch und finally;416
3.7.4.10;7.4.10 Indexinitialisierer;416
3.7.5;7.5 C# 7.0 – Visual Studio 2017;417
3.7.5.1;7.5.1 out-Variablen;417
3.7.5.2;7.5.2 Tupel;417
3.7.5.3;7.5.3 Mustervergleich;418
3.7.5.4;7.5.4 Discards;420
3.7.5.5;7.5.5 Lokale ref-Variablen und Rückgabetypen;420
3.7.5.6;7.5.6 Lokale Funktionen;420
3.7.5.7;7.5.7 Mehr Expression-Bodied Member;420
3.7.5.8;7.5.8 throw-Ausdrücke;421
3.7.5.9;7.5.9 Verbesserung der numerischen literalen Syntax;421
4;Teil II: Technologien;423
4.1;8 Zugriff auf das Dateisystem;425
4.1.1;8.1 Grundlagen;425
4.1.1.1;8.1.1 Klassen für den Zugriff auf das Dateisystem;426
4.1.1.2;8.1.2 Statische versus Instanzen-Klasse;426
4.1.2;8.2 Übersichten;427
4.1.2.1;8.2.1 Methoden der Directory-Klasse;428
4.1.2.2;8.2.2 Methoden eines DirectoryInfo-Objekts;428
4.1.2.3;8.2.3 Eigenschaften eines DirectoryInfo-Objekts;428
4.1.2.4;8.2.4 Methoden der File-Klasse;429
4.1.2.5;8.2.5 Methoden eines FileInfo-Objekts;430
4.1.2.6;8.2.6 Eigenschaften eines FileInfo-Objekts;430
4.1.3;8.3 Operationen auf Verzeichnisebene;431
4.1.3.1;8.3.1 Existenz eines Verzeichnisses/einer Datei feststellen;431
4.1.3.2;8.3.2 Verzeichnisse erzeugen und löschen;431
4.1.3.3;8.3.3 Verzeichnisse verschieben und umbenennen;432
4.1.3.4;8.3.4 Aktuelles Verzeichnis bestimmen;432
4.1.3.5;8.3.5 Unterverzeichnisse ermitteln;433
4.1.3.6;8.3.6 Alle Laufwerke ermitteln;433
4.1.3.7;8.3.7 Dateien kopieren und verschieben;434
4.1.3.8;8.3.8 Dateien umbenennen;435
4.1.3.9;8.3.9 Dateiattribute feststellen;435
4.1.3.10;8.3.10 Verzeichnis einer Datei ermitteln;437
4.1.3.11;8.3.11 Alle im Verzeichnis enthaltenen Dateien ermitteln;437
4.1.3.12;8.3.12 Dateien und Unterverzeichnisse ermitteln;438
4.1.4;8.4 Zugriffsberechtigungen;439
4.1.4.1;8.4.1 ACL und ACE;439
4.1.4.2;8.4.2 SetAccessControl-Methode;439
4.1.4.3;8.4.3 Zugriffsrechte anzeigen;440
4.1.5;8.5 Weitere wichtige Klassen;441
4.1.5.1;8.5.1 Die Path-Klasse;441
4.1.5.2;8.5.2 Die Klasse FileSystemWatcher;442
4.1.5.3;8.5.3 Die Klasse ZipArchive;443
4.1.6;8.6 Datei- und Verzeichnisdialoge;445
4.1.6.1;8.6.1 OpenFileDialog und SaveFileDialog;445
4.1.6.2;8.6.2 FolderBrowserDialog;447
4.1.7;8.7 Praxisbeispiele;448
4.1.7.1;8.7.1 Infos über Verzeichnisse und Dateien gewinnen;448
4.1.7.2;8.7.2 Eine Verzeichnisstruktur in die TreeView einlesen;451
4.1.7.3;8.7.3 Mit LINQ und RegEx Verzeichnisbäume durchsuchen;454
4.2;9 Dateien lesen und schreiben;459
4.2.1;9.1 Grundprinzip der Datenpersistenz;459
4.2.1.1;9.1.1 Dateien und Streams;459
4.2.1.2;9.1.2 Die wichtigsten Klassen;460
4.2.1.3;9.1.3 Erzeugen eines Streams;461
4.2.2;9.2 Dateiparameter;461
4.2.2.1;9.2.1 FileAccess;461
4.2.2.2;9.2.2 FileMode;462
4.2.2.3;9.2.3 FileShare;462
4.2.3;9.3 Textdateien;463
4.2.3.1;9.3.1 Eine Textdatei beschreiben bzw. neu anlegen;463
4.2.3.2;9.3.2 Eine Textdatei lesen;464
4.2.4;9.4 Binärdateien;466
4.2.4.1;9.4.1 Lese-/Schreibzugriff;466
4.2.4.2;9.4.2 Die Methoden ReadAllBytes und WriteAllBytes;467
4.2.4.3;9.4.3 Erzeugen von BinaryReader/BinaryWriter;467
4.2.5;9.5 Sequenzielle Dateien;468
4.2.5.1;9.5.1 Lesen und Schreiben von strukturierten Daten;468
4.2.5.2;9.5.2 Serialisieren von Objekten;469
4.2.6;9.6 Dateien verschlüsseln und komprimieren;470
4.2.6.1;9.6.1 Das Methodenpärchen Encrypt/Decrypt;470
4.2.6.2;9.6.2 Verschlüsseln unter Windows Vista/7/8/10;471
4.2.6.3;9.6.3 Verschlüsseln mit der CryptoStream-Klasse;472
4.2.6.4;9.6.4 Dateien komprimieren;473
4.2.7;9.7 Memory Mapped Files;474
4.2.7.1;9.7.1 Grundprinzip;474
4.2.7.2;9.7.2 Erzeugen eines MMF;475
4.2.7.3;9.7.3 Erstellen eines Map View;475
4.2.8;9.8 Praxisbeispiele;476
4.2.8.1;9.8.1 Auf eine Textdatei zugreifen;476
4.2.8.2;9.8.2 Einen Objektbaum persistent speichern;480
4.2.8.3;9.8.3 Ein Memory Mapped File (MMF) verwenden;487
4.2.8.4;9.8.4 Hex-Dezimal-Bytes-Konverter;489
4.2.8.5;9.8.5 Eine Datei verschlüsseln;493
4.2.8.6;9.8.6 Eine Datei komprimieren;496
4.2.8.7;9.8.7 PDFs erstellen/exportieren;498
4.2.8.8;9.8.8 Eine CSV-Datei erstellen;501
4.2.8.9;9.8.9 Eine CSV-Datei mit LINQ lesen und auswerten;504
4.2.8.10;9.8.10 Einen korrekten Dateinamen erzeugen;506
4.3;10 Asynchrone Programmierung;507
4.3.1;10.1 Übersicht;507
4.3.1.1;10.1.1 Multitasking versus Multithreading;508
4.3.1.2;10.1.2 Deadlocks;509
4.3.1.3;10.1.3 Racing;510
4.3.2;10.2 Programmieren mit Threads;511
4.3.2.1;10.2.1 Einführungsbeispiel;512
4.3.2.2;10.2.2 Wichtige Thread-Methoden;513
4.3.2.3;10.2.3 Wichtige Thread-Eigenschaften;515
4.3.2.4;10.2.4 Einsatz der ThreadPool-Klasse;516
4.3.3;10.3 Sperrmechanismen;518
4.3.3.1;10.3.1 Threading ohne lock;518
4.3.3.2;10.3.2 Threading mit lock;520
4.3.3.3;10.3.3 Die Monitor-Klasse;522
4.3.3.4;10.3.4 Mutex;526
4.3.3.5;10.3.5 Methoden für die parallele Ausführung sperren;527
4.3.3.6;10.3.6 Semaphore;528
4.3.4;10.4 Interaktion mit der Programmoberfläche;529
4.3.4.1;10.4.1 Die Werkzeuge;530
4.3.4.2;10.4.2 Einzelne Steuerelemente mit Invoke aktualisieren;530
4.3.4.3;10.4.3 Mehrere Steuerelemente aktualisieren;532
4.3.4.4;10.4.4 Ist ein Invoke-Aufruf nötig?;532
4.3.4.5;10.4.5 Und was ist mit WPF?;533
4.3.5;10.5 Timer-Threads;535
4.3.6;10.6 Die BackgroundWorker-Komponente;536
4.3.7;10.7 Asynchrone Programmierentwurfsmuster;538
4.3.7.1;10.7.1 Kurzübersicht;539
4.3.7.2;10.7.2 Polling;540
4.3.7.3;10.7.3 Callback verwenden;542
4.3.7.4;10.7.4 Callback mit Parameterübergabe verwenden;542
4.3.7.5;10.7.5 Callback mit Zugriff auf die Programmoberfläche;544
4.3.8;10.8 Asynchroner Aufruf beliebiger Methoden;545
4.3.8.1;10.8.1 Die Beispielklasse;545
4.3.8.2;10.8.2 Asynchroner Aufruf ohne Callback;546
4.3.8.3;10.8.3 Asynchroner Aufruf mit Callback und Anzeigefunktion;547
4.3.8.4;10.8.4 Aufruf mit Rückgabewerten (per Eigenschaft);548
4.3.8.5;10.8.5 Aufruf mit Rückgabewerten (per EndInvoke);549
4.3.9;10.9 Es geht auch einfacher – async und await;550
4.3.9.1;10.9.1 Der Weg von synchron zu asynchron;550
4.3.9.2;10.9.2 Achtung: Fehlerquellen!;552
4.3.9.3;10.9.3 Eigene asynchrone Methoden entwickeln;554
4.3.10;10.10 Praxisbeispiele;557
4.3.10.1;10.10.1 Spieltrieb & Multithreading erleben;557
4.3.10.2;10.10.2 Prozess- und Thread-Informationen gewinnen;570
4.3.10.3;10.10.3 Ein externes Programm starten;575
4.4;11 Die Task Parallel Library;579
4.4.1;11.1 Überblick;579
4.4.1.1;11.1.1 Parallel-Programmierung;579
4.4.1.2;11.1.2 Möglichkeiten der TPL;582
4.4.1.3;11.1.3 Der CLR-Threadpool;582
4.4.2;11.2 Parallele Verarbeitung mit Parallel.Invoke;583
4.4.2.1;11.2.1 Aufrufvarianten;584
4.4.2.2;11.2.2 Einschränkungen;585
4.4.3;11.3 Verwendung von Parallel.For;585
4.4.3.1;11.3.1 Abbrechen der Verarbeitung;587
4.4.3.2;11.3.2 Auswerten des Verarbeitungsstatus;588
4.4.3.3;11.3.3 Und was ist mit anderen Iterator-Schrittweiten?;589
4.4.4;11.4 Collections mit Parallel.ForEach verarbeiten;590
4.4.5;11.5 Die Task-Klasse;591
4.4.5.1;11.5.1 Einen Task erzeugen;591
4.4.5.2;11.5.2 Den Task starten;592
4.4.5.3;11.5.3 Datenübergabe an den Task;594
4.4.5.4;11.5.4 Wie warte ich auf das Ende des Task?;595
4.4.5.5;11.5.5 Tasks mit Rückgabewerten;597
4.4.5.6;11.5.6 Die Verarbeitung abbrechen;600
4.4.5.7;11.5.7 Fehlerbehandlung;604
4.4.5.8;11.5.8 Weitere Eigenschaften;605
4.4.6;11.6 Zugriff auf das User-Interface;606
4.4.6.1;11.6.1 Task-Ende und Zugriff auf die Oberfläche;606
4.4.6.2;11.6.2 Zugriff auf das UI aus dem Task heraus;608
4.4.7;11.7 Weitere Datenstrukturen im Überblick;610
4.4.7.1;11.7.1 Threadsichere Collections;610
4.4.7.2;11.7.2 Primitive für die Threadsynchronisation;611
4.4.8;11.8 Parallel LINQ (PLINQ);611
4.4.9;11.9 Praxisbeispiel: Spieltrieb – Version 2;611
4.4.9.1;11.9.1 Aufgabenstellung;612
4.4.9.2;11.9.2 Global-Klasse;612
4.4.9.3;11.9.3 Controller-Klasse;613
4.4.9.4;11.9.4 LKW-Klasse;615
4.4.9.5;11.9.5 Schiff-Klasse;616
4.4.9.6;11.9.6 Oberfläche;619
4.5;12 Fehlersuche und Behandlung;621
4.5.1;12.1 Der Debugger;621
4.5.1.1;12.1.1 Allgemeine Beschreibung;621
4.5.1.2;12.1.2 Die wichtigsten Fenster;622
4.5.1.3;12.1.3 Debugging-Optionen;625
4.5.1.4;12.1.4 Praktisches Debugging am Beispiel;628
4.5.2;12.2 Arbeiten mit Debug und Trace;632
4.5.2.1;12.2.1 Wichtige Methoden von Debug und Trace;632
4.5.2.2;12.2.2 Besonderheiten der Trace-Klasse;636
4.5.2.3;12.2.3 TraceListener-Objekte;637
4.5.3;12.3 Caller Information;639
4.5.3.1;12.3.1 Attribute;639
4.5.3.2;12.3.2 Anwendung;640
4.5.4;12.4 Fehlerbehandlung;641
4.5.4.1;12.4.1 Anweisungen zur Fehlerbehandlung;641
4.5.4.2;12.4.2 try-catch;641
4.5.4.3;12.4.3 try-finally;646
4.5.4.4;12.4.4 Das Standardverhalten bei Ausnahmen festlegen;649
4.5.4.5;12.4.5 Die Exception-Klasse;650
4.5.4.6;12.4.6 Fehler/Ausnahmen auslösen;651
4.5.4.7;12.4.7 Eigene Fehlerklassen;651
4.5.4.8;12.4.8 Exceptionhandling zur Entwurfszeit;653
4.5.4.9;12.4.9 Code Contracts;654
4.6;13 XML in Theorie und Praxis;655
4.6.1;13.1 XML – etwas Theorie;655
4.6.1.1;13.1.1 Übersicht;655
4.6.1.2;13.1.2 Der XML-Grundaufbau;658
4.6.1.3;13.1.3 Wohlgeformte Dokumente;659
4.6.1.4;13.1.4 Processing Instructions (PI);661
4.6.1.5;13.1.5 Elemente und Attribute;662
4.6.1.6;13.1.6 Verwendbare Zeichensätze;663
4.6.2;13.2 XSD-Schemas;666
4.6.2.1;13.2.1 XSD-Schemas und ADO.NET;666
4.6.2.2;13.2.2 XML-Schemas in Visual Studio analysieren;668
4.6.2.3;13.2.3 XML-Datei mit XSD-Schema erzeugen;672
4.6.2.4;13.2.4 XSD-Schema aus einer XML-Datei erzeugen;673
4.6.3;13.3 Verwendung des DOM unter .NET;673
4.6.3.1;13.3.1 Übersicht;673
4.6.3.2;13.3.2 DOM-Integration in C#;675
4.6.3.3;13.3.3 Laden von Dokumenten;675
4.6.3.4;13.3.4 Erzeugen von XML-Dokumenten;676
4.6.3.5;13.3.5 Auslesen von XML-Dateien;678
4.6.3.6;13.3.6 Direktzugriff auf einzelne Elemente;679
4.6.3.7;13.3.7 Einfügen von Informationen;680
4.6.3.8;13.3.8 Suchen in den Baumzweigen;683
4.6.4;13.4 XML-Verarbeitung mit LINQ to XML;686
4.6.4.1;13.4.1 Die LINQ to XML-API;686
4.6.4.2;13.4.2 Neue XML-Dokumente erzeugen;688
4.6.4.3;13.4.3 Laden und Sichern von XML-Dokumenten;690
4.6.4.4;13.4.4 Navigieren in XML-Daten;691
4.6.4.5;13.4.5 Auswählen und Filtern;693
4.6.4.6;13.4.6 Manipulieren der XML-Daten;694
4.6.4.7;13.4.7 XML-Dokumente transformieren;695
4.6.5;13.5 Weitere Möglichkeiten der XML-Verarbeitung;698
4.6.5.1;13.5.1 XML-Daten aus Objektstrukturen erzeugen;698
4.6.5.2;13.5.2 Schnelles Suchen in XML-Daten mit XPathNavigator;702
4.6.5.3;13.5.3 Schnelles Auslesen von XML-Daten mit XmlReader;704
4.6.5.4;13.5.4 Erzeugen von XML-Daten mit XmlWriter;706
4.6.5.5;13.5.5 XML transformieren mit XSLT;708
4.6.6;13.6 JSON – JavaScriptObjectNotation;710
4.6.6.1;13.6.1 Grundlagen;710
4.6.6.2;13.6.2 De-/Serialisierung mit JSON;710
4.6.7;13.7 Praxisbeispiele;713
4.6.7.1;13.7.1 Mit dem DOM in XML-Dokumenten navigieren;713
4.6.7.2;13.7.2 XML-Daten in eine TreeView einlesen;717
4.6.7.3;13.7.3 In Dokumenten mit dem XPathNavigator navigieren;721
4.7;14 Einführung in ADO.NET und Entity Framework;727
4.7.1;14.1 Eine kleine Übersicht;727
4.7.1.1;14.1.1 Die ADO.NET-Klassenhierarchie;727
4.7.1.2;14.1.2 Die Klassen der Datenprovider;729
4.7.1.3;14.1.3 Das Zusammenspiel der ADO.NET-Klassen;731
4.7.2;14.2 Das Connection-Objekt;732
4.7.2.1;14.2.1 Allgemeiner Aufbau;732
4.7.2.2;14.2.2 SqlConnection;732
4.7.2.3;14.2.3 Schließen einer Verbindung;733
4.7.2.4;14.2.4 Eigenschaften des Connection-Objekts;734
4.7.2.5;14.2.5 Methoden des Connection-Objekts;736
4.7.2.6;14.2.6 Der ConnectionStringBuilder;737
4.7.3;14.3 Das Command-Objekt;737
4.7.3.1;14.3.1 Erzeugen und Anwenden eines Command-Objekts;738
4.7.3.2;14.3.2 Erzeugen mittels CreateCommand-Methode;739
4.7.3.3;14.3.3 Eigenschaften des Command-Objekts;739
4.7.3.4;14.3.4 Methoden des Command-Objekts;741
4.7.3.5;14.3.5 Freigabe von Connection- und Command-Objekten;743
4.7.4;14.4 Parameter-Objekte;744
4.7.4.1;14.4.1 Erzeugen und Anwenden eines Parameter-Objekts;744
4.7.4.2;14.4.2 Eigenschaften des Parameter-Objekts;745
4.7.5;14.5 Das CommandBuilder-Objekt;746
4.7.5.1;14.5.1 Erzeugen;746
4.7.5.2;14.5.2 Anwenden;746
4.7.6;14.6 Das DataReader-Objekt;747
4.7.6.1;14.6.1 DataReader erzeugen;747
4.7.6.2;14.6.2 Daten lesen;748
4.7.6.3;14.6.3 Eigenschaften des DataReaders;749
4.7.6.4;14.6.4 Methoden des DataReaders;749
4.7.7;14.7 Das DataAdapter-Objekt;750
4.7.7.1;14.7.1 DataAdapter erzeugen;750
4.7.7.2;14.7.2 Command-Eigenschaften;751
4.7.7.3;14.7.3 Fill-Methode;752
4.7.7.4;14.7.4 Update-Methode;753
4.7.8;14.8 Entity Framework;754
4.7.8.1;14.8.1 Überblick;754
4.7.8.2;14.8.2 DatabaseFirst;756
4.7.8.3;14.8.3 CodeFirst;764
4.7.9;14.9 Praxisbeispiele;769
4.7.9.1;14.9.1 Wichtige ADO.NET-Objekte im Einsatz;769
4.7.9.2;14.9.2 Eine Aktionsabfrage ausführen;771
4.7.9.3;14.9.3 Eine StoredProcedure aufrufen;773
4.7.9.4;14.9.4 Die Datenbank aktualisieren;776
4.8;15 Das DataSet;781
4.8.1;15.1 Grundlegende Features des DataSets;781
4.8.1.1;15.1.1 Die Objekthierarchie;782
4.8.1.2;15.1.2 Die wichtigsten Klassen;782
4.8.1.3;15.1.3 Erzeugen eines DataSets;783
4.8.2;15.2 Das DataTable-Objekt;785
4.8.2.1;15.2.1 DataTable erzeugen;785
4.8.2.2;15.2.2 Spalten hinzufügen;785
4.8.2.3;15.2.3 Zeilen zur DataTable hinzufügen;786
4.8.2.4;15.2.4 Auf den Inhalt einer DataTable zugreifen;787
4.8.3;15.3 Die DataView;789
4.8.3.1;15.3.1 Erzeugen einer DataView;790
4.8.3.2;15.3.2 Sortieren und Filtern von Datensätzen;790
4.8.3.3;15.3.3 Suchen von Datensätzen;791
4.8.4;15.4 Typisierte DataSets;791
4.8.4.1;15.4.1 Ein typisiertes DataSet erzeugen;792
4.8.4.2;15.4.2 Das Konzept der Datenquellen;793
4.8.4.3;15.4.3 Typisierte DataSets und TableAdapter;794
4.8.5;15.5 Die Qual der Wahl;795
4.8.5.1;15.5.1 DataReader – der schnelle Lesezugriff;796
4.8.5.2;15.5.2 DataSet – die Datenbank im Hauptspeicher;796
4.8.5.3;15.5.3 Objektrelationales Mapping – die Zukunft?;797
4.8.6;15.6 Praxisbeispiele;798
4.8.6.1;15.6.1 In der DataView sortieren und filtern;798
4.8.6.2;15.6.2 Suche nach Datensätzen;800
4.8.6.3;15.6.3 Ein DataSet in einen XML-String serialisieren;802
4.8.6.4;15.6.4 Untypisiertes DataSet in ein typisiertes konvertieren;806
4.9;16 Verteilen von Anwendungen;813
4.9.1;16.1 ClickOnce-Deployment;814
4.9.1.1;16.1.1 Übersicht/Einschränkungen;814
4.9.1.2;16.1.2 Die Vorgehensweise;815
4.9.1.3;16.1.3 Ort der Veröffentlichung;815
4.9.1.4;16.1.4 Anwendungsdateien;816
4.9.1.5;16.1.5 Erforderliche Komponenten;817
4.9.1.6;16.1.6 Aktualisierungen;818
4.9.1.7;16.1.7 Veröffentlichungsoptionen;819
4.9.1.8;16.1.8 Veröffentlichen;820
4.9.1.9;16.1.9 Verzeichnisstruktur;820
4.9.1.10;16.1.10 Der Webpublishing-Assistent;822
4.9.1.11;16.1.11 Neue Versionen erstellen;823
4.9.2;16.2 Setup-Projekte;823
4.9.2.1;16.2.1 Installation;823
4.9.2.2;16.2.2 Ein neues Setup-Projekt;825
4.9.2.3;16.2.3 Dateisystem-Editor;830
4.9.2.4;16.2.4 Registrierungs-Editor;831
4.9.2.5;16.2.5 Dateityp-Editor;832
4.9.2.6;16.2.6 Benutzeroberflächen-Editor;832
4.9.2.7;16.2.7 Editor für benutzerdefinierte Aktionen;833
4.9.2.8;16.2.8 Editor für Startbedingungen;834
4.10;17 Weitere Techniken;835
4.10.1;17.1 Zugriff auf die Zwischenablage;835
4.10.1.1;17.1.1 Das Clipboard-Objekt;835
4.10.1.2;17.1.2 Zwischenablage-Funktionen für Textboxen;837
4.10.2;17.2 Arbeiten mit der Registry;838
4.10.2.1;17.2.1 Allgemeines;838
4.10.2.2;17.2.2 Registry-Unterstützung in .NET;840
4.10.3;17.3 .NET-Reflection;841
4.10.3.1;17.3.1 Übersicht;841
4.10.3.2;17.3.2 Assembly laden;842
4.10.3.3;17.3.3 Mittels GetType und Type Informationen sammeln;842
4.10.3.4;17.3.4 Dynamisches Laden von Assemblies;845
4.10.4;17.4 Praxisbeispiele;848
4.10.4.1;17.4.1 Zugriff auf die Registry;848
4.10.4.2;17.4.2 Dateiverknüpfungen erzeugen;850
4.10.4.3;17.4.3 Betrachter für Manifestressourcen;852
4.10.4.4;17.4.4 Die Zwischenablage überwachen und anzeigen;855
4.10.4.5;17.4.5 Die WIA-Library kennenlernen;858
4.10.4.6;17.4.6 Auf eine Webcam zugreifen;869
4.10.4.7;17.4.7 Auf den Scanner zugreifen;871
4.10.4.8;17.4.8 OpenOffice.org Writer per OLE steuern;877
4.10.4.9;17.4.9 Nutzer und Gruppen des aktuellen Systems ermitteln;884
4.10.4.10;17.4.10 Testen, ob Nutzer in einer Gruppe enthalten ist;886
4.10.4.11;17.4.11 Testen, ob der Nutzer ein Administrator ist;888
4.10.4.12;17.4.12 Die IP-Adressen des Computers bestimmen;889
4.10.4.13;17.4.13 Die IP-Adresse über den Hostnamen bestimmen;890
4.10.4.14;17.4.14 Diverse Systeminformationen ermitteln;891
4.10.4.15;17.4.15 Alles über den Bildschirm erfahren;899
4.10.4.16;17.4.16 Sound per MCI aufnehmen;901
4.10.4.17;17.4.17 Mikrofonpegel anzeigen;904
4.10.4.18;17.4.18 Pegeldiagramm aufzeichnen;906
4.10.4.19;17.4.19 Sound-und Videodateien per MCI abspielen;909
4.11;18 Konsolenanwendungen;919
4.11.1;18.1 Grundaufbau/Konzepte;919
4.11.1.1;18.1.1 Unser Hauptprogramm – Program.cs;920
4.11.1.2;18.1.2 Rückgabe eines Fehlerstatus;921
4.11.1.3;18.1.3 Parameterübergabe;922
4.11.1.4;18.1.4 Zugriff auf die Umgebungsvariablen;924
4.11.2;18.2 Die Kommandozentrale: System.Console;925
4.11.2.1;18.2.1 Eigenschaften;925
4.11.2.2;18.2.2 Methoden/Ereignisse;926
4.11.2.3;18.2.3 Textausgaben;926
4.11.2.4;18.2.4 Farbangaben;927
4.11.2.5;18.2.5 Tastaturabfragen;929
4.11.2.6;18.2.6 Arbeiten mit Streamdaten;930
4.11.3;18.3 Praxisbeispiel;932
4.11.3.1;18.3.1 Farbige Konsolenanwendung;932
4.11.3.2;18.3.2 Weitere Hinweise und Beispiele;934
5;Anhang A: Glossar;935
6;Anhang B: Wichtige Dateiextensions;939
7;Index;941
8;Leere Seite;2


Saumweber, Walter
Walter Saumweber hat langjährige Erfahrung als Entwickler, Berater und Dozent. Er ist Autor von zahlreichen Fachbüchern und Beiträgen in Computer-Fachzeitschriften und -Onlineportalen.

Walter Saumweber hat langjährige Erfahrung als Entwickler, Berater und Dozent. Er ist Autor von zahlreichen Fachbüchern und Beiträgen in Computer-Fachzeitschriften und -Onlineportalen.



Ihre Fragen, Wünsche oder Anmerkungen
Vorname*
Nachname*
Ihre E-Mail-Adresse*
Kundennr.
Ihre Nachricht*
Lediglich mit * gekennzeichnete Felder sind Pflichtfelder.
Wenn Sie die im Kontaktformular eingegebenen Daten durch Klick auf den nachfolgenden Button übersenden, erklären Sie sich damit einverstanden, dass wir Ihr Angaben für die Beantwortung Ihrer Anfrage verwenden. Selbstverständlich werden Ihre Daten vertraulich behandelt und nicht an Dritte weitergegeben. Sie können der Verwendung Ihrer Daten jederzeit widersprechen. Das Datenhandling bei Sack Fachmedien erklären wir Ihnen in unserer Datenschutzerklärung.