c# für fortgeschrittene
TRANSCRIPT
Präsentation von:
C# f ü r F o r t g e s c h r i t t e n e
Carl-Philip Wenz
Microsoft Student Partner Hochschule RheinMain E-Mail: [email protected]
Agenda
• Erweiterte „Grundlagen“
• Funktionale Aspekte
• Dynamische Aspekte
• Operator Überladung
02.03.2011 2
Erweiterte „Grundlagen“ Initialisierungslisten, var, Anonyme Klassen
02.03.2011 3
Initialisierungslisten
02.03.2011 4
Properties
Initialisierungsliste
Schlüsselwort: var
• var = automatische Typ Ableitung
• abgeleiteter Typ fest (unveränderbar)
02.03.2011 5
int x=12345; string test=“Hallo“;
Point punkt=new Point();
var x=12345; var test=“Hallo“;
var punkt=new Point(); äquivalent
Anonyme Typen
02.03.2011 6
Initialisierungsliste
Schlüsselwort var
Funktionale Programmierung yield, Lambda, LINQ
Schlüsselwort: yield
• dynamisch Werte liefern
• flexibles Anlegen von Aufzählungen
1 : anfordern
IEnumarable 2 : yield return
Client-Code: Methoden
foreach, LINQ
Schlüsselwort: yield
02.03.2011 9
class Points { private Random numberGenerator = new Random(); public int Count { get; set; } public int Max { get; set; } public int Min { get; set; } public IEnumerable<Point> GeneratePoints { get { for (int counter = 0; counter < Count; counter++) {
yield return new Point { X = numberGenerator.Next(Min, Max), Y = numberGenerator.Next(Min, Max) }; } } } }
Schlüsselwort: yield
02.03.2011 10
static void Main(string[] args) { Points generator = new Points { Min = 1, Max = 10, Count = 10 }; foreach (Point current in generator.GeneratePoints) { Console.WriteLine("({0},{1})", current.X, current.Y); } Console.ReadLine(); }
Lambda - Ausdrücke
• Delegates = Funktionszeiger
• Lambda-Ausrücke: Anonyme Methoden ganz kompakt
02.03.2011 11
(Parameter1, …) => Ausdruck (Parameter1, …)=> {Code-Block}
Lambda - Beispiel
02.03.2011 12
static void Main(string[] args) { Func<int, int, int> Summe = (a, b) => a + b; Func<int, int, int, int> Summe = (a, b, c) => a + b + c; Action<int> Print = number => Console.WriteLine("Ergebnis: {0}", number); Print(Summe(3, 4)); Print(Summe(10, 5)); Print(Summe(10, 5, 4)); }
Was ist LINQ?
• Language Integrated Query
• from item in collection where xxx select yyy
02.03.2011 13
int[] numbers = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; var even = from x in numbers where x % 2 == 0 select x; var doubleNumbers = from x in numbers select x * 2; var textNumbers = from x in numbers select "Nummer: " + x.ToString();
LINQ-Quellen
• Abfragetypen
– Objekte
– XML
– Datenbank
– viele weitere
• Amazon, Bing, SAP, ………….
02.03.2011 14
LINQ-Theorie
• fließbandartiges Abarbeiten
• beliebiges Verketten möglich
• Lazy-Evaluation
02.03.2011 15
from
where select
LINQ – Syntax-Varianten
Lambda – Variante
• list.where(a=>a%2==0)
• Aufruf von Methoden
• Übergeben von Lambda-Ausdrücken
Query Comprehension
• from x in y select z
• SQL ähnliche Syntax
• komprimierte Ausdrücke
02.03.2011 16
LINQ - Schlüsselwörter
• from – Iterieren von Werten | Kreuzprodukt
• where – Filtern von Werten
• order x by y – Sortieren
• group x by y into z – Gruppieren
• select – Projezieren
02.03.2011 17
02.03.2011 18
var KundenBestellungen = from posten in Bestellungen group posten by posten.Kunde into gruppe select new { KundenID = gruppe.Key, Bestellungen = gruppe };
var GesamtSumme = from kunde in Personen from gruppe in KundenBestellungen where kunde.ID == gruppe.KundenID select new { Name = kunde.Name, GesamtKosten = ( from produkt in Produkte from posten in gruppe.Bestellungen where produkt.ID == posten.Produkt select posten.Menge * produkt.Preis).Sum() };
LINQ Beispiel 1 var Personen = new[] { new {Name="Carl", ID=0}, new {Name="Max Mustermann", ID=1}, new {Name="Müller", ID=2} }; var Produkte = new[] { new {ID=0, Name="Bleistift", Preis=1.5}, new {ID=1, Name="Papier", Preis=2.75} }; var Bestellungen = new[] { new {Kunde=0, Produkt=0, Menge=2 },new {Kunde=0, Produkt=2, Menge=1 }, new {Kunde=1, Produkt=0, Menge=2 },new {Kunde=0, Produkt=3, Menge=3 } };
LINQ Beispiel 2
02.03.2011 19
static int ggT(int a, int b) { while (b != 0){int h = a % b; a = b; b = h;} return a; } static void Main(string[] args) { var Zahlen = Enumerable.Range(2, 20); var WertePaare = from a in Zahlen from b in Zahlen select new Tuple<int, int>(a, b);
var gleicherGGT = from item in WertePaare group item by ggT(item.Item1, item.Item2) into ggT_Group where ggT_Group.Count()>2 && ggT_Group.Key!=1 select new { GGT = ggT_Group.Key, Werte = ggT_Group }; foreach (var item in gleicherGGT) { Console.WriteLine("ggT: {0}",item.GGT); foreach (var pair in item.Werte) Console.Write("({0}|{1}) ", pair.Item1, pair.Item2); Console.WriteLine(); }
}
LINQ to XML • X-DOM -> performant und LINQ optimiert
02.03.2011 20
XDocument XElement
XElement XAttribute
XElement XText
XElement XComment
XDocument doc = new XDocument(); doc.Add( new XElement(XName.Get("Root"), new XElement(XName.Get("Left"), new XAttribute(XName.Get("Key"),"Value"), new XElement(XName.Get("Inner"),new XText("Inhalt")) ), new XElement(XName.Get("Right"),new XComment("Comment")) ) ); Console.Write(doc.ToString());
Funktionales Erzeugen
LINQ to XML - Beispiel
var doc = XDocument.Load("http://www.stnc.de/Feeds/News");
var allLinks =
from item in doc.Descendants(XName.Get("item"))
where item.Element(XName.Get("title")).
Value.Contains("Windows")
select item.Element(XName.Get("link")).Value;
foreach (var link in allLinks) Console.WriteLine(link);
02.03.2011 21
PLINQ
• LINQ + Parallelität
• Enumarable.AsParallel
• Aufzählungen mit yield haben AsParallel
PLINQ Beispiel
02.03.2011 23
var Zahlen = Enumerable.Range(2, 200);
var WertePaare = from a in Zahlen
from b in Zahlen
select new Tuple<int, int>(a, b);
var ggT_Werte = from item in WertePaare.AsParallel()
select new
{
ggT=ggT(item.Item1, item.Item2),Pair=item
};
foreach (var item in ggT_Werte)
{
Console.WriteLine("ggT({0},{1}): {2}",
item.Pair.Item1,item.Pair.Item2,item.ggT);
}
Dynamische Programmierung Dynamics
Dynamische Programmierung
• keine festgelegten Typen
• dynamisches Erstellen neuer Typen
• Duck-Typing
dynamic - Theorie
• dynamic steuerbar: DynamicObject
• Typen erzeugen: ExpandoObject
• Aktivieren von dynamics:
dynamic name=XXXXX;
02.03.2011 26
Beispiel - dynamic
private static dynamic Plus(dynamic a, dynamic b) { try { a = a.ToUpper(); b = b.ToUpper(); } catch (Exception) { } return a + b; } static void Main(string[] args) { Console.WriteLine("3+4= {0}", Plus(3, 4)); Console.WriteLine("Hallo + Welt = {0}", Plus("Hallo ", "Welt")); }
02.03.2011 27
Beispiel – Typen erzeugen
private static void PrintInfo(dynamic info) { Console.WriteLine("X: {0} Y: {1} Size: {2}", info.X, info.Y, info.Size()); } private static void AddMethods(dynamic toFill) { toFill.Size = new Func<double>(() => Math.Sqrt(toFill.X * toFill.X + toFill.Y * toFill.Y)); toFill.Move = new Action<int, int>((a, b) => { toFill.X += a; toFill.Y += b; }); } static void Main(string[] args) { dynamic vector = new ExpandoObject(); vector.X = 20; vector.Y = 10; AddMethods(vector); PrintInfo(vector); vector.Move(-10, 5); PrintInfo(vector); }
02.03.2011 28
Beispiel – Dynamic steuerbar class DynamicExample : DynamicObject
{
public override bool TryGetMember(GetMemberBinder binder, out object result) { Console.WriteLine("# Es wurde versucht {0} zu benutzen.", binder.Name); result = "Hallo"; return true; } public override bool TrySetMember(SetMemberBinder binder, object value) { Console.WriteLine("# {0} = {1}", binder.Name, value.ToString()); return true; } public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) { Console.WriteLine("# Methoden Aufruf {0}.", binder.Name); result = null; return true; } }
static void Main(string[] args)
{
dynamic test = new DynamicExample();
test.Hallo(); test.Variable = 25;
Console.WriteLine("Zugriff auf Variable Vorname: {0}", test.Vorname);
}
02.03.2011 29
Operatorüberladung
Operatorüberladung
• alle Operatorüberladungen statisch
• public static returnType operatoroperator(parameter)
02.03.2011 31
!, ~, ++, --, +, -, *, /, %, &, |, ^, <<, >>, ==, !=, <, >, <=, >=
Beispiel
02.03.2011 32
public class Vector { public int X { get; set; } public int Y { get; set; }
public static Vector operator+(Vector a, Vector b) { return new Vector { X = a.X + b.X, Y = a.Y + b.Y }; }
public static Vector operator ++(Vector input) { return new Vector { X = input.X + 1, Y = input.Y + 1 }; }
public override string ToString() { return string.Format("Point ({0}|{1})", X, Y); }
} static void Main(string[] args) { Vector a = new Vector { X = 1, Y = 2 }; Vector b = new Vector { X = 2, Y = 3 }; Vector c = a + b; Console.WriteLine(c++);Console.WriteLine(c++); }
Materialien • Visual Studio 2010 | Visual C# 2010 Express
• Bücher:
– OpenBook von Galileo Computing:
• http://openbook.galileocomputing.de/visual_csharp_2010/
Weiterführendes
• Empfehlung => F#
• Spaß am Programmieren mit Pex4Fun
02.03.2011 34
Fragen und Antworten
Vielen Dank für Ihre/Eure Aufmerksamkeit!
02.03.2011 35