Download de presentatie
De presentatie wordt gedownload. Even geduld aub
GepubliceerdCecilia Dekker Laatst gewijzigd meer dan 10 jaar geleden
1
Visual Basic 2008 – What’s new André Obelink, MCSD – MVP MarYor | software & consultancy www.vbcentral.nl | www.obelink.com | www.maryor.nl
2
Me.About.ToString() MarYor | software & consultancy MarYor | software & consultancy Auteur van artikelen en boeken.. Auteur van artikelen en boeken.. – Geschreven voor Microsoft.NET Magazine, PC Active, MSDN Magazine Europe, SDN Magazine, VB Magazine – Boek: Visual Basic 2005 – de Basis (9/2006) – Boek: Visual Basic Kookboek (3/2008) – Boek: Visual Basic 2008 – de Basis (verwacht 5/2008) De andere persoon achter VBcentral.nl De andere persoon achter VBcentral.nl VP Speakers Bureau INETA Europe VP Speakers Bureau INETA Europe Microsoft MVP voor Visual Basic sinds 2006 Microsoft MVP voor Visual Basic sinds 2006
3
Wat niet aan de orde komt… Diverse uitbreidingen binnen VS2008 IDE Diverse uitbreidingen binnen VS2008 IDE – Quality tools – Uitbreidingen ten behoeve van WPF applicaties – Uitbreidingen ten behoeve van webapplicaties – Reporting: nieuwe Report Projects – MSBuild: multi-targetting, multiple processors – ……. http://msdn2.microsoft.com/en-us/library/bb386063.aspx http://msdn2.microsoft.com/en-us/library/bb386063.aspx
4
Wat wel aan de orde komt… Performance VB2008 ten opzichte van VB2005 Performance VB2008 ten opzichte van VB2005 Intellisense Everywhere Intellisense Everywhere Language Integrated Query (LINQ) Language Integrated Query (LINQ) – LINQ to Objects, LINQ to SQL en LINQ to XML – En de taaluitbreidingen die LINQ mogelijk maakt… Type Infering, Object Initializers, Anonymous types, Extension methods, Lambda Expressions, … XML Data Type XML Data Type
5
Performance VB2008 ↔VB2005 Verdere performance verbeteringen - Debugger, projecten laden, … Bron: Lisa Feigenbaum (VB team). Testmachine: Windows XP, Dual Core Pentium, 3.0 Ghz, 1 GB RAM
6
Intellisense Intellisense ‘everywhere’ Intellisense ‘everywhere’ Performance sterk verbeterd Performance sterk verbeterd Intellisence voor JavaScript, CSS en XML literals Intellisence voor JavaScript, CSS en XML literals Transparant met CTRL toets Transparant met CTRL toets – onderliggende code zichtbaar VB: filtert het resultaat, waardoor lijst compacter VB: filtert het resultaat, waardoor lijst compacter VB: LINQ en Intellisense + tooltip hints VB: LINQ en Intellisense + tooltip hints
7
Visual Basic 9.0 – Design Goals Vereenvoudig het werken met data Vereenvoudig het werken met data – Integratie van query- en transformatie opdrachten – Universele manier van ‘quering’ van objecten, relationele data en XML data Vereenvoudig het werken met XML Vereenvoudig het werken met XML – Breng structuur in documenten zonder schema – Maak creëren van XML documenten makkelijker – Vereenvoudig toegang tot XML elementen
8
Databronnen die LINQ ondersteunen Language INtegrated Query (LINQ) LINQ To Objects Objecten LINQ To XML XML LINQ To Datasets LINQ To SQL LINQ To Entities Relationele data LINQ binnen ADO.NET Overige… VB C#.NET Language-Integrated Query
9
Demo Language Integrated Query
10
De ‘magie’ achter LINQ Dim query = From proc In Process.GetProcesses _ Where proc.Threads.Count > 10 _ Where proc.Threads.Count > 10 _ Select proc.ProcessName, proc.Threads.Count Select proc.ProcessName, proc.Threads.Count Dim query = From proc In Process.GetProcesses _ Where proc.Threads.Count > 10 _ Where proc.Threads.Count > 10 _ Select proc.ProcessName, proc.Threads.Count Select proc.ProcessName, proc.Threads.Count Dim query = Process.GetProcesses(). _ Where(Function(proc As Process) proc.Threads.Count > 10). _ Where(Function(proc As Process) proc.Threads.Count > 10). _ Select(Function(proc As Process) _ Select(Function(proc As Process) _ New With{.ProcessName = proc.ProcessName, _ New With{.ProcessName = proc.ProcessName, _.Count = proc.Threads.Count}).Count = proc.Threads.Count}) Dim query = Process.GetProcesses(). _ Where(Function(proc As Process) proc.Threads.Count > 10). _ Where(Function(proc As Process) proc.Threads.Count > 10). _ Select(Function(proc As Process) _ Select(Function(proc As Process) _ New With{.ProcessName = proc.ProcessName, _ New With{.ProcessName = proc.ProcessName, _.Count = proc.Threads.Count}).Count = proc.Threads.Count}) Function _Filter1(proc As Process) As Boolean Return proc.Threads.Count > 10 Return proc.Threads.Count > 10 Exit Function Function _Filter1(proc As Process) As Boolean Return proc.Threads.Count > 10 Return proc.Threads.Count > 10 Exit Function Function _Projection1(proc As Process) As Function _Projection1(proc As Process) As Dim projection As New Dim projection As New projection.ProcessName = proc.ProcessName projection.ProcessName = proc.ProcessName projection.Count = proc.Threads.Count projection.Count = proc.Threads.Count Return projection Return projection End Function Function _Projection1(proc As Process) As Function _Projection1(proc As Process) As Dim projection As New Dim projection As New projection.ProcessName = proc.ProcessName projection.ProcessName = proc.ProcessName projection.Count = proc.Threads.Count projection.Count = proc.Threads.Count Return projection Return projection End Function
11
Query Expressions
12
Relationele data vandaag de dag Dim connection As New SqlConnection(…) connection.Open() Dim cmd As New SqlCommand(“SELECT c.Name, c.Phone “ & _ “FROM Customers As c” & _ “FROM Customers As c” & _ “WHERE c.City = @p0”) “WHERE c.City = @p0”) cmd.Parameters(“@p0”) = “London” Dim dr As DataReader = connection.Execute(cmd) While dr.Read() Dim name as String = dr.GetString(0) Dim name as String = dr.GetString(0) Dim telefoon as String = dr.GetString(1) Dim telefoon as String = dr.GetString(1) Dim gebdatum As Date = dr.GetDateTime(2) Dim gebdatum As Date = dr.GetDateTime(2) End While connection.Close() Dim connection As New SqlConnection(…) connection.Open() Dim cmd As New SqlCommand(“SELECT c.Name, c.Phone “ & _ “FROM Customers As c” & _ “FROM Customers As c” & _ “WHERE c.City = @p0”) “WHERE c.City = @p0”) cmd.Parameters(“@p0”) = “London” Dim dr As DataReader = connection.Execute(cmd) While dr.Read() Dim name as String = dr.GetString(0) Dim name as String = dr.GetString(0) Dim telefoon as String = dr.GetString(1) Dim telefoon as String = dr.GetString(1) Dim gebdatum As Date = dr.GetDateTime(2) Dim gebdatum As Date = dr.GetDateTime(2) End While connection.Close() Queries tussen aanhalingstekens
13
Relationele Data met LINQ Public Class Customer … End Class Public Class Northwind Inherits DataContext Inherits DataContext Public Property Customers As Table(Of Customer) Public Property Customers As Table(Of Customer) … End Class Public Class Customer … End Class Public Class Northwind Inherits DataContext Inherits DataContext Public Property Customers As Table(Of Customer) Public Property Customers As Table(Of Customer) … End Class Dim db As New Northwind(…) Dim contact = From cust in db.Customers _ Where cust.City = “London” Where cust.City = “London” Select cust.Name, cust.Phone Select cust.Name, cust.Phone For Each custInfo in Contacts DoeIets(custInfo.Name, custInfo.Phone) DoeIets(custInfo.Name, custInfo.Phone)Next Dim db As New Northwind(…) Dim contact = From cust in db.Customers _ Where cust.City = “London” Where cust.City = “London” Select cust.Name, cust.Phone Select cust.Name, cust.Phone For Each custInfo in Contacts DoeIets(custInfo.Name, custInfo.Phone) DoeIets(custInfo.Name, custInfo.Phone)Next Klassen beschrijven data Een Table is een soort collection ‘strongly typed’ connection Geïntegreerde query syntax ‘strongly typed’ resultaten
14
Demo Linq voor relationele data – Linq to SQL
15
From komt voor Select From komt voor Select Even wennen aan de ‘SQL’ syntax Dim klanten = From klant in db.Customers _ Select klant.CustomerID, klant.CompanyName Select klant.CustomerID, klant.CompanyName Dim klanten = From klant in db.Customers _ Select klant.CustomerID, klant.CompanyName Select klant.CustomerID, klant.CompanyName Nodig voor IntelliSense Dim klanten2 = From klant in klanten _ Where klant.Name.StartsWith(“O”) _ Where klant.Name.StartsWith(“O”) _ Select klant.Name, klant.City Select klant.Name, klant.City Dim klanten2 = From klant in klanten _ Where klant.Name.StartsWith(“O”) _ Where klant.Name.StartsWith(“O”) _ Select klant.Name, klant.City Select klant.Name, klant.City Dim klanten = From klant in db.Customers _ Select klant.Name, klant.City, klant.ZIP _ Select klant.Name, klant.City, klant.ZIP _ Order By ZIP, _ Select Name, City Order By ZIP, _ Select Name, City Dim klanten = From klant in db.Customers _ Select klant.Name, klant.City, klant.ZIP _ Select klant.Name, klant.City, klant.ZIP _ Order By ZIP, _ Select Name, City Order By ZIP, _ Select Name, City Veel vrijheid bij bouwen query Veel vrijheid bij bouwen query Bouw opdrachten ‘regel voor regel’ … … en over meerdere statements Eventueel Select achterwege laten
16
Expliciete aggregatie Expliciete aggregatie Bevat ook operators voor hiërarchische data Bevat ook operators voor hiërarchische data Even wennen aan de ‘SQL’ syntax Dim klanten = From sod in db.SalesOrderDetails _ Group By sod.SalesOrderHeader.CustomerID _ Group By sod.SalesOrderHeader.CustomerID _ Into OrderTotaal = Sum(sod.OrderQty * sod.UnitPrice) _ Into OrderTotaal = Sum(sod.OrderQty * sod.UnitPrice) _ Select CustomerID, OrderTotaal Select CustomerID, OrderTotaal Dim klanten = From sod in db.SalesOrderDetails _ Group By sod.SalesOrderHeader.CustomerID _ Group By sod.SalesOrderHeader.CustomerID _ Into OrderTotaal = Sum(sod.OrderQty * sod.UnitPrice) _ Into OrderTotaal = Sum(sod.OrderQty * sod.UnitPrice) _ Select CustomerID, OrderTotaal Select CustomerID, OrderTotaal Zogenaamde ‘Grouping Key’ Expliciete aggregatie Imports System.Diagnostics Dim procs = From proc In Process.GetProcesses() _ Aggregate thread In proc.Threads _ Aggregate thread In proc.Threads _ Into ThreadPriorityGemiddelde = Average(thread.CurrentPriority) _ Into ThreadPriorityGemiddelde = Average(thread.CurrentPriority) _ Select LijstProcessen = proc.ProcessName, ThreadPriorityGemiddelde Select LijstProcessen = proc.ProcessName, ThreadPriorityGemiddelde Imports System.Diagnostics Dim procs = From proc In Process.GetProcesses() _ Aggregate thread In proc.Threads _ Aggregate thread In proc.Threads _ Into ThreadPriorityGemiddelde = Average(thread.CurrentPriority) _ Into ThreadPriorityGemiddelde = Average(thread.CurrentPriority) _ Select LijstProcessen = proc.ProcessName, ThreadPriorityGemiddelde Select LijstProcessen = proc.ProcessName, ThreadPriorityGemiddelde Groep bestaat al
17
Demo Linq to XML – Maak XML
18
Maak XML - vandaag de dag Dim doc As New XmlDocument Dim wns As XmlElement = doc.CreateElement("Werknemers") For Each werknemer As Werknemer In werknemers If werknemer.Achternaam = "Jansen" Then If werknemer.Achternaam = "Jansen" Then Dim wn As XmlElement = doc.CreateElement("Werknemer") Dim wn As XmlElement = doc.CreateElement("Werknemer") Dim BSN As XmlAttribute = doc.CreateAttribute("BSN") Dim BSN As XmlAttribute = doc.CreateAttribute("BSN") BSN.Value = werknemer.BSN : wn.Attributes.Append(BSN) BSN.Value = werknemer.BSN : wn.Attributes.Append(BSN) Dim an As XmlElement = doc.CreateElement("Achternaam") Dim an As XmlElement = doc.CreateElement("Achternaam") an.InnerText = werknemer.Achternaam : wn.AppendChild(an) an.InnerText = werknemer.Achternaam : wn.AppendChild(an) Dim voornaam As XmlElement = doc.CreateElement("Voornaam") Dim voornaam As XmlElement = doc.CreateElement("Voornaam") voornaam.InnerText = werknemer.Voornaam : wn.AppendChild(voornaam) voornaam.InnerText = werknemer.Voornaam : wn.AppendChild(voornaam) wns.AppendChild(wn) wns.AppendChild(wn) End If End IfNextdoc.AppendChild(wns) Dim doc As New XmlDocument Dim wns As XmlElement = doc.CreateElement("Werknemers") For Each werknemer As Werknemer In werknemers If werknemer.Achternaam = "Jansen" Then If werknemer.Achternaam = "Jansen" Then Dim wn As XmlElement = doc.CreateElement("Werknemer") Dim wn As XmlElement = doc.CreateElement("Werknemer") Dim BSN As XmlAttribute = doc.CreateAttribute("BSN") Dim BSN As XmlAttribute = doc.CreateAttribute("BSN") BSN.Value = werknemer.BSN : wn.Attributes.Append(BSN) BSN.Value = werknemer.BSN : wn.Attributes.Append(BSN) Dim an As XmlElement = doc.CreateElement("Achternaam") Dim an As XmlElement = doc.CreateElement("Achternaam") an.InnerText = werknemer.Achternaam : wn.AppendChild(an) an.InnerText = werknemer.Achternaam : wn.AppendChild(an) Dim voornaam As XmlElement = doc.CreateElement("Voornaam") Dim voornaam As XmlElement = doc.CreateElement("Voornaam") voornaam.InnerText = werknemer.Voornaam : wn.AppendChild(voornaam) voornaam.InnerText = werknemer.Voornaam : wn.AppendChild(voornaam) wns.AppendChild(wn) wns.AppendChild(wn) End If End IfNextdoc.AppendChild(wns) <Werknemers> Jansen Jansen Piet Piet …</Werknemers><Werknemers> Jansen Jansen Piet Piet …</Werknemers> Imperatief model ‘Document centric’ Geen geïntegreerde queries Geheugen intensief
19
LINQ to XML – Maak XML Dim xml As New XElement("Werknemers", _ From w In werknemers _ From w In werknemers _ Where w.Achternaam = "Jansen" _ Where w.Achternaam = "Jansen" _ Select New XElement("Werknemer", _ Select New XElement("Werknemer", _ New XAttribute("BSN", w.BSN), _ New XAttribute("BSN", w.BSN), _ New XElement("Achternaam", w.Achternaam), _ New XElement("Achternaam", w.Achternaam), _ New XElement("Voornaam", w.Voornaam))) New XElement("Voornaam", w.Voornaam))) Dim xml As New XElement("Werknemers", _ From w In werknemers _ From w In werknemers _ Where w.Achternaam = "Jansen" _ Where w.Achternaam = "Jansen" _ Select New XElement("Werknemer", _ Select New XElement("Werknemer", _ New XAttribute("BSN", w.BSN), _ New XAttribute("BSN", w.BSN), _ New XElement("Achternaam", w.Achternaam), _ New XElement("Achternaam", w.Achternaam), _ New XElement("Voornaam", w.Voornaam))) New XElement("Voornaam", w.Voornaam))) Declaratief model Geïntegreerde queries ‘Element centric’ Kleiner en sneller
20
Demo Linq to XML – Geïntegreerde XML binnen VB
21
Geïntegreerde XML binnen VB Dim werknemersxml = _ <%= From w in werknemers _ <%= From w in werknemers _ Where w.Voornaam = “Jan” _ Where w.Voornaam = “Jan” _ Select Select %> %> Dim werknemersxml = _ <%= From w in werknemers _ <%= From w in werknemers _ Where w.Voornaam = “Jan” _ Where w.Voornaam = “Jan” _ Select Select %> %> Infers Xml.Linq XElement Geen conceptuele barrière ‘Expression holes’ voor dynamische data / variabelen.
22
Query expressions Query expressions XML literals XML literals XML element access XML element access Nullable types Nullable types Object initializers Object initializers Local type inference Local type inference Lambda expressions Lambda expressions Visual Basic 2008 - Features Extension methods Extension methods Expression trees Expression trees Anonymous types Anonymous types Ternary operator Ternary operator Coalesce operator Coalesce operator Relaxed delegates Relaxed delegates Partial methods Partial methods
23
Tot de tijd op is… Taaluitbreidingen die LINQ mogelijk maken, maar ook erg handig zijn voor eigen gebruik!
24
Uitbreiden van bestaande datatypen Uitbreiden van bestaande datatypen – Plaats methode in module en in zelfde namespace – Markeer methode met – Markeer methode met Extension methods _ _ Public Function Omdraaien(ByVal tekst As String) As String Dim karakterArray() As Char = tekst.ToCharArray() Dim karakterArray() As Char = tekst.ToCharArray() Array.Reverse(karakterArray) Array.Reverse(karakterArray) Return New String(karakterArray) Return New String(karakterArray) End Function _ _ Public Function Omdraaien(ByVal tekst As String) As String Dim karakterArray() As Char = tekst.ToCharArray() Dim karakterArray() As Char = tekst.ToCharArray() Array.Reverse(karakterArray) Array.Reverse(karakterArray) Return New String(karakterArray) Return New String(karakterArray) End Function Dim strNaam As String = “André” Debug.Print strNaam.Omdraaien() --------------ResultaatérdnA Dim strNaam As String = “André” Debug.Print strNaam.Omdraaien() --------------ResultaatérdnA
25
Specificieer eigenschappen bij instantiëren Specificieer eigenschappen bij instantiëren – Is anders dan een overloaded Sub New() – Gebruik With {.eigenschapnaam = ….} Object Initializers Public Class Werknemer Public Property BSN() As String Public Property BSN() As String …. …. End Property End Property …. …. End Class Public Class Werknemer Public Property BSN() As String Public Property BSN() As String …. …. End Property End Property …. …. End Class Dim werknemer As New Werknemer() With {.BSN = “123”} of … Dim bestand As New FileInfo(“c:\test.txt”) _ With {.IsReadOnly = True, _ With {.IsReadOnly = True, _.CreationTime = Now}.CreationTime = Now} Dim werknemer As New Werknemer() With {.BSN = “123”} of … Dim bestand As New FileInfo(“c:\test.txt”) _ With {.IsReadOnly = True, _ With {.IsReadOnly = True, _.CreationTime = Now}.CreationTime = Now}
26
Definieer + instantieer objecten ‘on the fly’ Definieer + instantieer objecten ‘on the fly’ – … dit is waar LINQ op gebaseerd is... Anonymous Types Dim boek = New With {.Titel = "Visual Basic Kookboek", _.Auteur = "André Obelink", _.Auteur = "André Obelink", _.ISBN = 9789043014878}.ISBN = 9789043014878} boek.Titel &= " - Luxe Editie" Dim boek = New With {.Titel = "Visual Basic Kookboek", _.Auteur = "André Obelink", _.Auteur = "André Obelink", _.ISBN = 9789043014878}.ISBN = 9789043014878} boek.Titel &= " - Luxe Editie"
27
Functiedefinitie binnen een andere functie Functiedefinitie binnen een andere functie – lambda expressies zijn ook als argument te gebruiken – soort instantie van een delegate Lambda Expressions Dim woordenLijst As New List(Of String) woordenLijst.Add("een") : woordenLijst.Add("twee") woordenLijst.Add("vier") : woordenLijst.Add("zes") Dim DrieLetterWoorden = Function(s As String) s.Length = 3 Dim lijst = woordenLijst.FindAll(DrieLetterWoorden) For Each getal In lijst MessageBox.Show(getal) MessageBox.Show(getal)Next Dim woordenLijst As New List(Of String) woordenLijst.Add("een") : woordenLijst.Add("twee") woordenLijst.Add("vier") : woordenLijst.Add("zes") Dim DrieLetterWoorden = Function(s As String) s.Length = 3 Dim lijst = woordenLijst.FindAll(DrieLetterWoorden) For Each getal In lijst MessageBox.Show(getal) MessageBox.Show(getal)Next Dim Verdubbel = Function(Getal As Integer) Getal * 2 MessageBox.Show(Verdubbel(5).ToString)MessageBox.Show(Verdubbel(13).ToString) MessageBox.Show(Verdubbel(5).ToString)MessageBox.Show(Verdubbel(13).ToString)
28
Refactor! Refactor! – Gratis Visual Studio Add-In van DevExpress – Geschikt voor Visual Basic 2003 – 2008 – Veel nieuwe features (>15), enkele alleen VB Visual Basic Power Packs 3.0 VB6 upgrade Visual Basic Power Packs 3.0 VB6 upgrade – PrintForm, Printer Compatibility Library – Line en Shape Controls – Interop Forms Toolkit 2.0 MDI + User controls – DataRepeater Control Visual Basic 2008 – Extra’s
29
Vragen? e-mail:andre@obelink.com web:www.obelink.com | www.maryor.nl
Verwante presentaties
© 2024 SlidePlayer.nl Inc.
All rights reserved.