35
Präsentation von: C# für Fortgeschrittene Carl-Philip Wenz Microsoft Student Partner Hochschule RheinMain E-Mail: [email protected]

C# für Fortgeschrittene

Embed Size (px)

Citation preview

Page 1: C# für Fortgeschrittene

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]

Page 2: C# für Fortgeschrittene

Agenda

• Erweiterte „Grundlagen“

• Funktionale Aspekte

• Dynamische Aspekte

• Operator Überladung

02.03.2011 2

Page 3: C# für Fortgeschrittene

Erweiterte „Grundlagen“ Initialisierungslisten, var, Anonyme Klassen

02.03.2011 3

Page 4: C# für Fortgeschrittene

Initialisierungslisten

02.03.2011 4

Properties

Initialisierungsliste

Page 5: C# für Fortgeschrittene

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

Page 6: C# für Fortgeschrittene

Anonyme Typen

02.03.2011 6

Initialisierungsliste

Schlüsselwort var

Page 7: C# für Fortgeschrittene

Funktionale Programmierung yield, Lambda, LINQ

Page 8: C# für Fortgeschrittene

Schlüsselwort: yield

• dynamisch Werte liefern

• flexibles Anlegen von Aufzählungen

1 : anfordern

IEnumarable 2 : yield return

Client-Code: Methoden

foreach, LINQ

Page 9: C# für Fortgeschrittene

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) }; } } } }

Page 10: C# für Fortgeschrittene

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(); }

Page 11: C# für Fortgeschrittene

Lambda - Ausdrücke

• Delegates = Funktionszeiger

• Lambda-Ausrücke: Anonyme Methoden ganz kompakt

02.03.2011 11

(Parameter1, …) => Ausdruck (Parameter1, …)=> {Code-Block}

Page 12: C# für Fortgeschrittene

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)); }

Page 13: C# für Fortgeschrittene

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();

Page 14: C# für Fortgeschrittene

LINQ-Quellen

• Abfragetypen

– Objekte

– XML

– Datenbank

– viele weitere

• Amazon, Bing, SAP, ………….

02.03.2011 14

Page 15: C# für Fortgeschrittene

LINQ-Theorie

• fließbandartiges Abarbeiten

• beliebiges Verketten möglich

• Lazy-Evaluation

02.03.2011 15

from

where select

Page 16: C# für Fortgeschrittene

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

Page 17: C# für Fortgeschrittene

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

Page 18: C# für Fortgeschrittene

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 } };

Page 19: C# für Fortgeschrittene

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(); }

}

Page 20: C# für Fortgeschrittene

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

Page 21: C# für Fortgeschrittene

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

Page 22: C# für Fortgeschrittene

PLINQ

• LINQ + Parallelität

• Enumarable.AsParallel

• Aufzählungen mit yield haben AsParallel

Page 23: C# für Fortgeschrittene

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);

}

Page 24: C# für Fortgeschrittene

Dynamische Programmierung Dynamics

Page 25: C# für Fortgeschrittene

Dynamische Programmierung

• keine festgelegten Typen

• dynamisches Erstellen neuer Typen

• Duck-Typing

Page 26: C# für Fortgeschrittene

dynamic - Theorie

• dynamic steuerbar: DynamicObject

• Typen erzeugen: ExpandoObject

• Aktivieren von dynamics:

dynamic name=XXXXX;

02.03.2011 26

Page 27: C# für Fortgeschrittene

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

Page 28: C# für Fortgeschrittene

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

Page 29: C# für Fortgeschrittene

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

Page 30: C# für Fortgeschrittene

Operatorüberladung

Page 31: C# für Fortgeschrittene

Operatorüberladung

• alle Operatorüberladungen statisch

• public static returnType operatoroperator(parameter)

02.03.2011 31

!, ~, ++, --, +, -, *, /, %, &, |, ^, <<, >>, ==, !=, <, >, <=, >=

Page 32: C# für Fortgeschrittene

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++); }

Page 33: C# für Fortgeschrittene

Materialien • Visual Studio 2010 | Visual C# 2010 Express

• Bücher:

– OpenBook von Galileo Computing:

• http://openbook.galileocomputing.de/visual_csharp_2010/

Page 34: C# für Fortgeschrittene

Weiterführendes

• Empfehlung => F#

• Spaß am Programmieren mit Pex4Fun

02.03.2011 34

Page 35: C# für Fortgeschrittene

Fragen und Antworten

Vielen Dank für Ihre/Eure Aufmerksamkeit!

02.03.2011 35