• Herhaling vorige les
  • Project beoordelingsformulier staat op Blackboard
  • Toets: kijk naar de lesdoelen
  • Ook bij code in C# wordt versiebeheer vaak ondergebracht bij GIT
  • GIT is geen GitHub
  • In wordt GIT wordt standaard ondersteund in de Team Explorer
  • In wordt GIT wordt standaard ondersteund in de Source Control
  • Alternatief: GIT via de terminal of via een tool zoals SourceTree
  • Voordeel van geintegreerd GIT gebruik: GIT Ignore goed ingesteld
  • GIT verplicht tijdens project
  • Kies zelf een GIT branching strategie (Git flow, GitHub flow, ...)

Literatuur:

  • Github is van Microsoft
  • Mercurial
  • Syntax: Func<int, int> func = (int x) => x + 1;
  • Lambda expressies vs anonieme functies
  • Wat is functioneel programmeren?
  • Closures
    String tekst = "grote knop"; groteKnop.setOnAction((ActionEvent e) -> System.out.println("Je klikte op de " + tekst)); tekst = "kleine knop"; kleineKnop.setOnAction((ActionEvent e) -> System.out.println("Je klikte op de " + tekst)); String tekst = "grote knop"; groteKnop.Click += (sender, args) => Console.WriteLine("Je klikte op de " + tekst); tekst = "kleine knop"; kleineKnop.Click += (sender, args) => Console.WriteLine("Je klikte op de " + tekst);

Makkelijk variabelen initialiseren

Student std = new Student() { StudentID = 1, StudentName = "Famke" };

List-initializers:

List<int> cijfers = new List<int> { 0, 1, 2, 3 };

Wat gebeurt er nu als je niet alle properties een waarde geeft?

Antwoord op de vraag: dan krijgt die property de default waarde. Voor value types (int: 0, decimal: 0.0… etc); voor reference types (String: null, List<T>: null… etc)

Literatuur

  • Hiermee kun je ook value types een waarde null toekennen.
  • Let op: int? is niet hetzelfde type als int, maar gedraagt zich bijna gelijk.
  • Lifed operatoren
  • A?.B?.Do(C); en A?.B?[C]; en ??=
  • Wat wordt er op het scherm geschreven, als volgende code wordt uitgevoerd? int? i = null; int j = i ?? 5; i = j; Console.WriteLine(i);

Zie de docs.

  • Expression bodied members: public (double Circumference, double Area) Stats => (2, 5);
  • Pattern matching: if (input is int count) sum += count;
  • using
  • Discards: var (_, _, _, pop1, _, pop2) = QueryCityDataForYears("New York City", 1960, 2010);
  • String interpolation: Console.WriteLine($"|{"Left",-7}|{"Right",7}|"); message = $"The speed of light is {speedOfLight:N3} km/s.";

C# kent net als Java ook verschillende datastructuren:

  • List
  • Queue
  • Stack
  • Dictionary (C# voor HashMap)
  • Etc.

Zie algoritmen en datastructuren semester 4...

Literatuur: lees dit en dit.
  • C# leidt zelf af wat het type is van de variabele op basis van de waarde rechts van de =-operator.
  • Wat is type inference? Herinner: public void func<T, S>(T arg1, T arg2, S arg3) { } public void func<T, S>(T arg1, S arg2, S arg3) { } Bestaat de diamond operator?
  • Als je het datatype niet correct gebruikt, krijg je dus gewoon een compile-error
  • Omdat de compiler het datatype kent, werkt IntelliSense dus ook gewoon.
  • Is var langzamer?
  • LET OP: Een methode kan geen variabele van het type var teruggeven
  • LET OP: var in C# betekent echt iets anders dan var in JavaScript of PHP

Literatuur: lees dit.

IList<Leerling> leerlingen = new List<Leerling>() { new Leerling("Famke", 5), new Leerling("Bill", 3), new Leerling("Pipi", 3), new Leerling("Mohammed", 4), new Leerling("John", 6) }; var query = from student in leerlingen where student.groep > 4 select student;
  • Je kunt filteren met Where
  • Je kunt ook alfabetisch sorteren of de lengte van strings bepalen
  • LINQ lijkt qua taal veel op SQL
  • Dan weet je meteen waar de Q van LINQ en SQL voor staat: Query
  • Wees je bewust van de Query-syntax, maar we gebruiken deze niet

Literatuur: lees dit en dit.

  • Het Where-statement is een normale methode
  • LET OP : alleen beschikbaar na using System.Linq
  • Het argument is nogal bijzonder: dat noem je een lambda-expressie
  • Een lambda-expressie is niets meer dan een verkorte schrijfwijze voor een (anonymous) method

Literatuur: lees dit en dit

  • LINQ = Language INtegrated Query
  • Je query-achtige operaties om in C# een query te schrijven
  • De data mag uit verschillende bronnen komen
    • De data kan worden opgehaald uit een database
    • Maar die data kan ook worden gecombineerd met data uit een Collection
  • Vergelijk LINQ met Java streams
  • LINQ kun je ook gebruiken als je geen gebruik maakt van Entity Framework

We gebruiken LINQ-methods in semester 3, omdat dit in de praktijk de meest gebruikte syntax is.

Naast de Where zijn er ook andere methodes die veel worden gebruikt:

  • OrderBy
  • ToList
  • First(OrDefault), Last(OrDefault), ElementAt en Single
  • Count, Average, Sum, Max en Min
  • All, Any, Contains
  • Select

Wat is een IEnumerable?

De returntypen van LINQ methoden zijn:

  • Soms: collectie in collectie uit
  • Soms: collectie in element uit

Soms geven methoden een exceptie, soms een null

  • FirstOrDefault: null als leeg
  • First: exceptie als leeg
  • Single: exceptie als niet precies 1
IList<Leerling> leerlingen = new List<Leerling>() { new Leerling("Famke", 5), new Leerling("Bill", 3), new Leerling("Pipi", 3), new Leerling("Mohammed", 4), new Leerling("John", 6) }; var query = from student in leerlingen let naamlengte = student.naam.Length group student by (naamlengte, student.groep) into g where g.Count() > 1 orderby g.Key.naamlengte select g;
Lees dit.
  • Deferred execution betekent dat de evaluatie van een LINQ-expressive wordt uitgesteld totdat de uitkomst van de evaluatie echt nodig is.
  • Deferred execution levert performance op.
  • Deferred execution levert op dat de evaluatie altijd plaatsvindt op de meest recente data
  • Meestal merk je weinig van deferred execution maar het kan zijn dat in je datasource (vaak de database) tussentijds (buiten jouw programma) iets is veranderd
  • Op basis van deferred execution begrijp je dan waarom er soms meer (of minder) rows voorkomen in de Collection waarop jij je LINQ-methode uitvoert
  • Als je bijv. de methode .ToList() gebruikt in je LINQ-query, dwingt dat wel directe execution af
  • Ook de foreach-lus zorgt dat deferred execution op dat moment wordt uitgevoerd.
Demo

Bedenk in 5 minuten:

  • een klasse met een aantal properties, en
  • in het Nederlands, een query op een lijst van objecten van deze klasse.

Deel dit met je maatje. Programmeer in 5 minuten: de query in LINQ.

Twee programmeurs tegenover elkaar
Zie Blackboard