Florian Rappl, Universität Regensburg
Bitte Fragen direkt einbringen und bei Verständnisproblemen sofort nachfassen.
unsafe) nicht durchführbarIDisposable implementierenGC.Collect() sammelt Leichen ein
class) abgelegtstruct) abgelegt
static void Swap<T>(ref T a, ref T b) {
T temp = a; a = b; b = temp;
}
int x = 10, y = 20;
Swap<int>(ref x, ref y);
Swap(ref x, ref y); //Wird vom Compiler korrekt aufgelöst
class MyClass<T> where T : new()
{
/* Inhalt hier */
}
class, struct, interface und die Möglichkeit einen (Basis) Typ anzugebenusing einbindenvar entscheidet der Compiler über den TypenExpression<T>
var lambda = x => x * x - x;
var lambda = (x, y) => { var z = x * y - x; Console.WriteLine(z); }
var und objectobject ist ein echter Datentyp - jeder Typ erbt von Objectvar ist nur ein Platzhalter, der vom Compiler aufgelöst wird
int a = 20;
var b = 30;
object c = 40;
Console.WriteLine(a + b);//Geht - liefert 50
Console.WriteLine(a + c);//Geht nicht - Addition nicht definiert für object und int
var ist notwendig bei der Erstellung anonymer Objekte
var a = new { Name = "Florian", Age = 28 };
var verwenden um auf die (read-only) Eigenschaften zuzugreifenIEnumerable<T> möglichIEnumerable<T>
var query = from n in names where n.Contains("a") orderby n.Length select n.ToUpper();
from Anweisungselect oder group Anweisung auflet eingeführt werdenSystem.Linq Namespaces
var query = names.Where(n => n.Contains("a")).OrderBy(n => n.Length).Select(n => n.ToUpper());
First(), ToList(), ...
Last())Sum(), Max() etc. mit leeren Datenquellen - Fehlergefahr!Count() zu überprüfen, sollte Any() verwendet werdenFirst() sollten bei Unklarheit über den Zustand der Liste nicht verwendet werden, sondern
nur Elemente wie FirstOrDefault() mit anschließender Abfrage auf null
// Ganz allgemeine Duplikate entfernen
var distinctItems = items.Distinct();
// Duplikate durch verschiedene Eigenschaften identifizieren, z.B. nach Id
var distinctItems = items.GroupBy(x => x.Id).Select(y => y.First());
// Umgedreht, wir wollen alle Duplikate
var duplicates = items.GroupBy(x => x).Where(g => g.Count() > 1).Select(g => g.Key);
Intersect() arbeiten
IEnumerable<T> (In-Memory Daten)IQueryable<T> sind auch Remote Zugriffe möglich (baut nur eine Abfrage)ToArray() ausgeführt, was letztlich In-Memory Daten erzeugttypeof() inspiziert werdenGetType()TypeGetProperties() alle Eigenschaften des Typs
is und as einsetzenis können wir auf Verwandtschaft abfrageninstanz.GetType() == typeof(Klasse) darasinstanz is Klasse ? (Klasse)instanz : null?? Operator können wir sehr schnell auf null überprüfendynamicdynamic, object, varobject ist das (allgemeinste) Objekt in C# - jede Instanz ist vom Typ object und besitzt deren Methoden (z.B. ToString())var wird vom Compiler aufgelöst und ist an einen Typen gebunden - erleichtert uns nur die Schreibarbeitdynamic ist dynamisch zur Laufzeit und verfügt über keine IntelliSense Unterstützung im Visual StudioSystem.Threading neue Threads aufzumachenThread Klasse lediglich eine Methode ohne RückgabetypThread Konzept ist bereits sehr alt und umständlich
BackgroundWorkerTask im UI ThreaddelegateInvokeRequired Eigenschaft true istdelegate erstelltContinueWith()Task Konzept wurden weitere Verbesserungen wie z.B. PLINQ (Parallel LINQ) eingeführtParallel KlasseFor() und ForEach()for-Schleife
for(var i = 0; i < 10; i++)
Console.WriteLine(i);
Parallel.For(0, 10, i => {
Console.WriteLine(i); });
async und awaitasync habenawait an
Florian Rappl, Universität Regensburg