Sie sind hier
E-Book

C# 6.0 - kurz & gut

AutorBen Albahari, Joseph Albahari
VerlagO'Reilly Verlag
Erscheinungsjahr2016
ReiheO'Reilly`s kurz & gut 
Seitenanzahl232 Seiten
ISBN9783960100454
FormatPDF/ePUB
KopierschutzWasserzeichen/DRM
GerätePC/MAC/eReader/Tablet
Preis11,99 EUR
Dieses Buch ist für vielbeschäftigte Programmierer gedacht, die eine knappe, aber dennoch gut verständliche Beschreibung von C# 6.0 suchen. C# 6.0 - kurz & gut informiert Sie über genau das, was Sie wissen müssen, um schnell durchstarten zu können. Behandelt werden: - alle Aspekte der C#-Syntax, vordefinierte Typen, Ausdrücke und Operatoren - das Erstellen von Klassen, Structs, Delegates und Events, Enums, Generics und Constraints, Exception Handling und Iteratoren - die Feinheiten des Boxing, das Überladen von Operatoren, Lambda-Ausdrücke, die Delegate-Kovarianz oder das Auflösen von Erweiterungsmethoden - dynamische Bindung und asynchrone Funktionen - LINQ - von den Standard-Abfrageoperatoren bis zu einer vollständigen Referenz der Query-Syntax Trotz seines erstaunlich kompakten Formats bietet dieses Buch eine Fülle von Details. Es unterstützt Sie optimal, die konzeptionellen Herausforderungen beim Lernen von C# 6.0 schnell zu meistern. Wenn Sie bereits mit Java, C++ oder einer älteren Version von C# vertraut sind, ist C# 6.0 - kurz & gut die ideale Wahl.

Joseph Albahari entwirft Enterprise-Anwendungen auf .NET und auf anderen Plattformen und hat in der Telekommunikation sowie im Gesundheits- und im Bildungswesen gearbeitet. Neben einer Reihe von O'Reilly-Büchern hat er auch LINQPad, das beliebten Query-Tool für LINQ, geschrieben. Ben Albahari war Programm-Manager bei Microsoft und ist der Gründer von takeonit.com. Er ist auch Mitbegründer der Firma Genamics, einem Tools-Anbieter für C#- und J++-Programmierer, der Software für DNA- und Proteinsequenz-Analysen entwickelt.

Kaufen Sie hier:

Horizontale Tabs

Leseprobe

Generics


C# verfügt über zwei separate Mechanismen, um Code zu schreiben, der mit verschiedenen Typen verwendbar ist: Vererbung und Generics. Während bei der Vererbung die Wiederverwendbarkeit durch einen Basistyp ausgedrückt wird, geschieht dies bei Generics durch ein »Template«, das Typen als »Platzhalter« enthält. Generics können im Vergleich zur Vererbung die Typsicherheit erhöhen und für weniger Casting und Boxing sorgen.

Generische Typen

Ein generischer Typ deklariert Typparameter – Platzhaltertypen, die vom Anwender des generischen Typs gefüllt werden, indem er die Typargumente bereitstellt. Hier wurde ein generischer Typ Stack<T> entworfen, der Instanzen vom Typ T auf einem Stack verwalten soll. Stack<T> deklariert einen einzelnen Typparameter T:

public class Stack<T>
{
  int position;
  T[] data = new T[100];
  public void Push (T obj) => data[position++] = obj;
  public T Pop()           => data[--position];
}

Wir können Stack<T> so nutzen:

var stack = new Stack<int>();
stack.Push(5);
stack.Push(10);
int x = stack.Pop();        // x ist 10
int y = stack.Pop();        // y ist 5

Beachten Sie, dass in den beiden letzten Zeilen keine Downcasts erforderlich sind, was das Risiko eines Laufzeitfehlers und den Overhead der Boxing/Unboxing-Operationen vermeidet. Das macht unseren generischen Stack einem nichtgenerischen Stack überlegen, der object anstelle von T nutzt (ein Beispiel finden Sie unter »Der Typ object« auf Seite 87).

Stack<int> gibt für den Typparameter T das Typargument int vor, wodurch implizit ein Typ erstellt wird (die Synthese geschieht zur Laufzeit). Stack<int> hat im Endeffekt folgende Definition (die Ersetzungen sind hervorgehoben und der Klassenname wurde durch ### ersetzt, um Verwirrung zu vermeiden):

public class ###
{
  int position;
  int[] data;
  public void Push (int obj) => data[position++] = obj;
  public int Pop()           => data[--position];
}

Technisch ausgedrückt, ist Stack<T> ein offener Typ, Stack<int> dagegen ein geschlossener Typ. Zur Laufzeit sind alle Instanzen generischer Typen geschlossen – ihre Typplatzhalter sind gefüllt.

Generische Methoden

Eine generische Methode deklariert Typparameter innerhalb ihrer Signatur. Mit generischen Methoden können viele grundlegende Algorithmen sehr allgemein implementiert werden. Hier sehen Sie eine generische Methode, die zwei Werte eines beliebigen Typs T vertauscht:

static void Swap<T> (ref T a, ref T b)
{
  T temp = a; a = b; b = temp;
}

Swap<T> kann wie folgt verwendet werden:

int x = 5, y = 10;
Swap (ref x, ref y);

Im Allgemeinen ist es nicht notwendig, Typargumente an eine generische Methode zu übergeben, da der Compiler den Typ implizit ermitteln kann. Würde das zu einer Mehrdeutigkeit führen, können generische Methoden mit dem Typargument aufgerufen werden:

Swap<int> (ref x, ref y);

Innerhalb eines generischen Typs ist eine Methode so lange nichtgenerisch, wie sie nicht selbst Typparameter einführt (mit den spitzen Klammern). In unserem generischen Stack nutzt die Methode Pop nur den schon im Typ bestehenden Typparameter T und ist daher nicht als generische Methode klassifiziert.

Methoden und Typen sind die einzigen Konstrukte, die Typparameter einführen können. Eigenschaften, Indexer, Events, Felder, Operatoren und so weiter können keine Typparameter deklarieren, auch wenn sie die Typparameter verwenden können, die vom umhüllenden Typ deklariert wurden. In unserem Beispiel mit dem generischen Stack könnten wir zum Beispiel einen Indexer schreiben, der ein generisches Element zurückgibt:

public T this [int index] { get { return data[index]; } }

Auch Konstruktoren können nur die vorhandenen Typparameter nutzt, aber nicht selbst welche einführen.

Deklarieren generischer Parameter

Typparameter können bei der Deklaration von Klassen, Structs, Interfaces, Delegates (siehe »Delegates« auf Seite 110) und Methoden eingeführt werden. Ein generischer Typ bzw. eine generische Methode kann mehrere Typparameter haben:

class Dictionary<TKey, TValue> {...}

Die Instanziierung erfolgt folgendermaßen:

var myDic = new Dictionary<int,string>();

Generische Typnamen und Methodennamen können überladen werden, solange sich die Anzahl der Typparameter unterscheidet. So kommen zum Beispiel die folgenden drei Typnamen nicht miteinander in Konflikt:

class A {}
class A<T> {}
class A<T1,T2> {}

Es ist üblich, bei generischen Typen und Methoden mit einem einzelnen Typparameter diesen Parameter T zu nennen, solange der Sinn des Parameters klar ist. Bei mehreren Typparametern beginnt jeder Parameter mit T, hat aber einen stärker beschreibenden Namen.

typeof und ungebundene generische Typen

Zur Laufzeit gibt es keine offenen generischen Typen: Offene generische Typen werden bei der Kompilation geschlossen. Aber es kann zur Laufzeit ungebundene generische Typen geben – nur als Type-Objekt. Einen ungebundenen generischen Typ können Sie in C# nur mit dem typeof-Operator angeben:

class A<T> {}
class A<T1,T2> {}
...

Type a1 = typeof (A<>);   // Ungebundener Typ
Type a2 = typeof (A<,>);  // Zeigt 2 Typargumente an
Console.Write (a2.GetGenericArguments().Count());  // 2

Sie können den typeof-Operator nutzen, um einen geschlossenen Typ anzugeben

Type a3 = typeof (A<int,int>);

oder einen offenen Typ (der zur Laufzeit geschlossen ist):

class B<T> { void X() { Type t = typeof (T); } }

Der generische Wert default

Das Schlüsselwort default kann genutzt werden, um den Standardwert für einen angegebenen generischen Typparameter zu erhalten. Der Standardwert für einen Referenztyp ist null, der für Werttypen ist das Ergebnis eines bitweisen Löschens der Felder des Typs:

static void Zap<T> (T[] array)
{
  for (int i = 0; i < array.Length; i++)
    array[i] = default(T);
}

Generische Constraints

Standardmäßig kann ein Typparameter durch jeden beliebigen Typ ersetzt werden. Constraints können auf einen Typparameter angewandt werden, um spezifischere Typargumente zu verlangen. Es gibt sechs Arten von Constraints:

where T : Basisklasse   // Basisklassen-Constraint
where T : Interface     // Interface-Constraint
where T : class         // Referenztyp-Constraint
where T : struct        // Werttyp-Constraint
where T : new()         // Parameterloser Konstruktor
                        // Constraint
where U : T             // Typ-Constraint

Im folgenden Beispiel verlangt GenericClass<T,U>, dass T von SomeClass abgeleitet ist (oder der Klasse selbst entspricht) und Interface1 implementiert, und verlangt außerdem, dass U einen parameterlosen Konstruktor anbietet:

class     SomeClass {}
interface Interface1 {}

class GenericClass<T,U> where T : SomeClass, Interface1
                        where U : new()
{ ... }

Constraints können überall dort angewendet werden, wo generische Parameter definiert sind, sowohl in Methoden als auch in Typdefinitionen.

Ein Basisklassen-Constraint verlangt, dass der Typparameter eine Subklasse einer bestimmten Klasse sein muss (oder die Klasse selbst); ein Interface-Constraint fordert, dass der Typparameter dieses Interface implementieren muss. Diese Constraints gestatten es, dass Instanzen des Typparameters implizit in diese Klasse oder dieses Interface umgewandelt werden.

Der class-Constraint und der struct-Constraint erfordern, dass T ein Referenztyp beziehungsweise ein (nicht nullbarer) Werttyp ist. Der parameterlose Konstruktor-Constraint erfordert, dass T einen...

Blick ins Buch
Inhaltsverzeichnis
Inhalt4
C# 6.0 – kurz & gut6
Ein erstes C#-Programm7
Kompilation9
Syntax10
Bezeichner und Schlüsselwörter11
Konflikte vermeiden12
Kontextuelle Schlüsselwörter12
Literale, Satzzeichen und Operatoren13
Kommentare13
Typgrundlagen14
Vordefinierte Typen14
Benutzerdefinierte Typen15
Member eines Typs16
Symmetrie vordefinierter und benutzerdefinierter Typen16
Konstruktoren und Instanziierung17
Instanz-Member versus statische Member17
Das Schlüsselwort public18
Umwandlungen18
Werttypen vs. Referenztypen19
Werttypen19
Referenztypen20
Null22
Die Einteilung der vordefinierten Typen23
Numerische Typen24
Numerische Literale25
Typableitung bei numerischen Literalen25
Numerische Suffixe25
Numerische Umwandlung26
Ganzzahlige Umwandlungen26
Reelle Umwandlungen26
Reelle Typen in ganzzahlige Typen umwandeln26
Arithmetische Operatoren27
Inkrement- und Dekrementoperatoren27
Besondere integrale Operationen27
Ganzzahlige Division27
Ganzzahlüberlauf28
Die Operatoren checked und unchecked28
Bitoperatoren29
8- und 16-Bit-Ganzzahlwerte29
Spezielle Float- und Double-Werte29
double vs. decimal30
Rundungsfehler bei reellen Zahlen31
Der Typ bool und die booleschen Operatoren31
Gleichheits- und Vergleichsoperatoren32
Bedingungsoperatoren32
Strings und Zeichen33
String-Typ34
String-Verkettung35
String-Interpolation (C# 6)36
String-Vergleiche36
In Strings suchen37
Strings verändern37
Arrays37
Standard-Elementinitialisierung39
Mehrdimensionale Arrays39
Rechteckige Arrays40
Ungleichförmige Arrays40
Vereinfachter Array-Initialisierungsausdruck41
Variablen und Parameter42
Der Stack und der Heap42
Stack42
Heap42
Sichere Zuweisung43
Vorgabewerte44
Parameter44
Argumente als Wert übergeben45
Der Modifikator ref46
Der Modifikator out46
Der Modifikator params47
Optionale Parameter47
Benannte Argumente48
var &ndash Implizit typisierte lokale Variablen49
Ausdrücke und Operatoren50
Zuweisungsausdrücke51
Priorität und Assoziativität von Operatoren51
Priorität51
Linksassoziative Operatoren52
Rechtsassoziative Operatoren52
Operatorentabelle52
Null-Operatoren55
Null-Verbindungsoperator56
Null-Bedingungsoperator (C# 6)56
Anweisungen57
Deklarationsanweisungen58
Variablen mit lokaler Geltung58
Ausdrucksanweisungen58
Auswahlanweisungen59
Die if-Anweisung59
Die else-Klausel59
Änderung des Programmflusses durch geschweifte Klammern59
Die switch-Anweisung60
Iterationsanweisungen62
while- und do-while-Schleifen62
for-Schleifen63
foreach-Schleifen63
Sprunganweisungen64
Die break-Anweisung64
Die continue-Anweisung64
Die goto-Anweisung65
Die return-Anweisung65
Namensräume65
Die using-Direktive67
using static (C# 6)67
Regeln in einem Namensraum68
Geltung von Namen68
Namen verdecken69
Wiederholte Namensräume69
Der Qualifizierer global::69
Aliase für Typen und Namensräume69
Klassen70
Felder70
Methoden71
Expression-bodied Methoden (C# 6)71
Methoden überladen72
Instanzkonstruktoren72
Implizite parameterlose Konstruktoren73
Nicht öffentliche Konstruktoren73
Objektinitialisierer73
Die Referenz this74
Eigenschaften75
Expression-bodied Eigenschaften (C# 6)76
Automatische Eigenschaften76
Eigenschaftsinitialisierer (C# 6)77
Sichtbarkeit von get und set77
Indexer78
Implementieren eines Indexers78
Konstanten79
Statische Konstruktoren80
Statische Klassen80
Finalizer81
Partielle Typen und Methoden81
Partielle Methoden82
Der Operator nameof (C# 6)82
Vererbung83
Polymorphie84
Casting und Referenzumwandlungen84
Upcasting85
Downcasting85
Der as-Operator86
Der is-Operator86
Virtuelle Funktions-Member87
Abstrakte Klassen und abstrakte Member88
Verbergen geerbter Member88
Funktionen und Klassen versiegeln89
Das Schlüsselwort base89
Konstruktoren und Vererbung90
Reihenfolge von Konstruktor- und Feld-Initialisierung91
Auflösen beim Überladen91
Der Typ object92
Boxing und Unboxing93
Statische und Laufzeit-Typprüfung94
Die GetType-Methode und der typeof-Operator94
Die Member von object95
Equals, ReferenceEquals und GetHashCode95
Die ToString-Methode96
Structs96
Semantik beim Erzeugen eines Struct97
Zugriffsmodifikatoren97
Friend Assemblies98
Beschneiden der Sichtbarkeit99
Interfaces99
Erweitern eines Interface100
Explizite Implementierung eines Interface100
Virtuelles Implementieren von Interface-Membern101
Reimplementieren eines Interface in einer Subklasse102
Enums103
Enum-Konvertierungen103
Flag-Enums104
Enum-Operatoren105
Eingebettete Typen105
Generics106
Generische Typen106
Generische Methoden108
Deklarieren generischer Parameter109
typeof und ungebundene generische Typen109
Der generische Wert default110
Generische Constraints110
Erstellen abgeleiteter Klassen von generischen Typen111
Selbstreferenzielle generische Deklarationen112
Statische Daten112
Kovarianz113
Kontravarianz115
Delegates115
Schreiben von Plug-in-Methoden mit Delegates116
Multicast-Delegates117
Instanzmethoden versus statische Methoden als Ziele118
Generische Delegate-Typen118
Die Func- und Action-Delegates119
Delegate-Kompatibilität119
Rückgabetypvarianz120
Parametervarianz120
Typparametervarianz bei generischen Delegates121
Events122
Standard-Event-Muster124
Event-Accessors127
Lambda-Ausdrücke128
Äußere Variablen übernehmen130
Iterationsvariablen übernehmen131
Anonyme Methoden132
try-Anweisungen und Exceptions133
Die catch-Klausel135
Exception-Filter (C# 6)136
Der finally-Block137
Die using-Anweisung138
Werfen von Exceptions138
Eine Exception weiterwerfen139
Wichtige Eigenschaften von System.Exception140
Die wichtigsten Exception-Typen140
Enumeration und Iteratoren141
Enumeration141
Collection-Initialisierer142
Iteratoren143
Iteratorsemantik145
Mehrere yield-Anweisungen145
yield break146
Sequenzen kombinieren146
Nullbare Typen147
Das Struct Nullable148
Nullbare Konvertierungen148
Boxing/Unboxing nullbarer Werte149
Übernommene Operatoren149
Gleichheitsoperatoren (==, !=)150
Relationale Operatoren (=, >)150
Alle anderen Operatoren (+, &ndash, *, /, %, &, |, ^, >, +, ++, --, !, ~)150
Mischen von nullbaren und nicht nullbaren Typen151
bool? mit den Operatoren & und |151
Nullbare Typen und Null-Operatoren152
Überladen von Operatoren152
Operatorfunktion153
Überladen von Gleichheits- und Vergleichsoperatoren154
Eigene implizite und explizite Konvertierungen155
Erweiterungsmethoden156
Verketten von Erweiterungsmethoden156
Mehrdeutigkeit und Auflösung157
Namensräume157
Erweiterungsmethoden vs. Instanzmethoden157
Erweiterungsmethoden vs. Erweiterungsmethoden157
Anonyme Typen158
LINQ158
Grundlagen von LINQ159
Eine einfache Abfrage160
Projizieren161
Take und Skip161
Elementoperatoren162
Aggregationsoperatoren162
Quantifizierer163
Mengenoperatoren163
Verzögerte Ausführung163
Standard-Abfrageoperatoren165
Abfrageoperatoren verketten169
Abfrageausdrücke170
Abfrageausdrücke vs. fließende Syntax172
Das Schlüsselwort let173
Abfragefortsetzungen174
Mehrere Generatoren175
Verknüpfen176
GroupJoin178
Zip179
Ordnen180
Gruppieren181
OfType und Cast183
Die dynamische Bindung183
Statische Bindung vs. dynamische Bindung184
Benutzerdefinierte Bindung185
Sprachbindung186
RuntimeBinderException188
Laufzeitdarstellung von dynamic188
Dynamische Konvertierungen189
var vs. dynamic189
Dynamische Ausdrücke190
Die dynamische Auflösung überladener Member190
Nicht aufrufbare Funktionen192
Attribute193
Attributklassen193
Benannte und positionelle Attributparameter194
Attributziele194
Angeben mehrerer Attribute194
Schreiben eigener Attribute195
Auslesen von Attributen zur Laufzeit196
Aufrufer-Info-Attribute197
Asynchrone Funktionen198
Die Schlüsselwörter await und async200
Lokale Zustände einfangen203
Asynchrone Funktionen schreiben203
Task zurückliefern204
Parallelität206
Asynchrone Lambda-Ausdrücke207
Unsicherer Code und Zeiger208
Zeigergrundlagen208
Unsicherer Code208
Die Anweisung fixed209
Der Zeiger-auf-Member-Operator210
Arrays210
Das Schlüsselwort stackalloc keyword210
Puffer fester Größe211
void*211
Präprozessordirektiven212
Warnungen214
XML-Dokumentation215
Standard-XML-Dokumentations-Tags216
Index220
www.oreilly.de0

Weitere E-Books zum Thema: Programmiersprachen - Softwareentwicklung

ASP.NET Shortcut

E-Book ASP.NET Shortcut
Format: PDF

Shortcut-Tipps für ASP.NET-Profis Die neue .NET-Version der Active Server Pages stellt eine Umgebung zur Entwicklung von Web-Applikationen im .NET-Framework bereit. Viele aus der Desktop-…

ASP.NET Shortcut

E-Book ASP.NET Shortcut
Format: PDF

Shortcut-Tipps für ASP.NET-Profis Die neue .NET-Version der Active Server Pages stellt eine Umgebung zur Entwicklung von Web-Applikationen im .NET-Framework bereit. Viele aus der Desktop-…

ASP.NET Shortcut

E-Book ASP.NET Shortcut
Format: PDF

Shortcut-Tipps für ASP.NET-Profis Die neue .NET-Version der Active Server Pages stellt eine Umgebung zur Entwicklung von Web-Applikationen im .NET-Framework bereit. Viele aus der Desktop-…

Programmieren lernen in PHP 5

E-Book Programmieren lernen in PHP 5
Format: PDF

Mit der Version 5 erreicht PHP einen bemerkenswerten Reifegrad, der PHP zu einer festen Größe in der Welt der Webprogrammierung macht. Gerade die leichte Erlernbarkeit macht PHP zur idealen…

Mathematik für Informatiker

E-Book Mathematik für Informatiker
Format: PDF

Die Informatik entwickelt sich in einer unglaublichen Geschwindigkeit. Häufig ist die Mathematik Grundlage von Neuerungen. Deshalb ist sie unverzichtbares Werkzeug jedes Informatikers und Pflichtfach…

Mathematik für Informatiker

E-Book Mathematik für Informatiker
Format: PDF

Die Informatik entwickelt sich in einer unglaublichen Geschwindigkeit. Häufig ist die Mathematik Grundlage von Neuerungen. Deshalb ist sie unverzichtbares Werkzeug jedes Informatikers und Pflichtfach…

Mathematik für Informatiker

E-Book Mathematik für Informatiker
Format: PDF

Die Informatik entwickelt sich in einer unglaublichen Geschwindigkeit. Häufig ist die Mathematik Grundlage von Neuerungen. Deshalb ist sie unverzichtbares Werkzeug jedes Informatikers und Pflichtfach…

Weitere Zeitschriften

Menschen. Inklusiv leben

Menschen. Inklusiv leben

MENSCHEN. das magazin informiert über Themen, die das Zusammenleben von Menschen in der Gesellschaft bestimmen -und dies konsequent aus Perspektive der Betroffenen. Die Menschen, um die es geht, ...

AUTOCAD & Inventor Magazin

AUTOCAD & Inventor Magazin

FÜHREND - Das AUTOCAD & Inventor Magazin berichtet seinen Lesern seit 30 Jahren ausführlich über die Lösungsvielfalt der SoftwareLösungen des Herstellers Autodesk. Die Produkte gehören zu ...

BMW Magazin

BMW Magazin

Unter dem Motto „DRIVEN" steht das BMW Magazin für Antrieb, Leidenschaft und Energie − und die Haltung, im Leben niemals stehen zu bleiben.Das Kundenmagazin der BMW AG inszeniert die neuesten ...

DER PRAKTIKER

DER PRAKTIKER

Technische Fachzeitschrift aus der Praxis für die Praxis in allen Bereichen des Handwerks und der Industrie. “der praktiker“ ist die Fachzeitschrift für alle Bereiche der fügetechnischen ...

SPORT in BW (Württemberg)

SPORT in BW (Württemberg)

SPORT in BW (Württemberg) ist das offizielle Verbandsorgan des Württembergischen Landessportbund e.V. (WLSB) und Informationsmagazin für alle im Sport organisierten Mitglieder in Württemberg. ...

e-commerce magazin

e-commerce magazin

PFLICHTLEKTÜRE – Seit zwei Jahrzehnten begleitet das e-commerce magazin das sich ständig ändernde Geschäftsfeld des Online- handels. Um den Durchblick zu behalten, teilen hier renommierte ...

Eishockey NEWS

Eishockey NEWS

Eishockey NEWS bringt alles über die DEL, die DEL2, die Oberliga sowie die Regionalligen und Informationen über die NHL. Dazu ausführliche Statistiken, Hintergrundberichte, Personalities ...

FileMaker Magazin

FileMaker Magazin

Das unabhängige Magazin für Anwender und Entwickler, die mit dem Datenbankprogramm Claris FileMaker Pro arbeiten. In jeder Ausgabe finden Sie von kompletten Lösungsschritten bis zu ...