Florian Rappl, Universität Regensburg
Bitte Fragen direkt einbringen und bei Verständnisproblemen sofort nachfassen.
unsafe
) nicht durchführbarIDisposable
implementierenGC.Collect()
sammelt Leichen einclass
) 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 object
object
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()
arbeitenIEnumerable<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()
Type
GetProperties()
alle Eigenschaften des Typsis
und as
einsetzenis
können wir auf Verwandtschaft abfrageninstanz.GetType() == typeof(Klasse)
daras
instanz is Klasse ? (Klasse)instanz : null
??
Operator können wir sehr schnell auf null
überprüfendynamic
dynamic
, object
, var
object
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ändlichBackgroundWorker
Task
im UI Threaddelegate
InvokeRequired
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 await
async
habenawait
anFlorian Rappl, Universität Regensburg