Visual Basic 2008 – What’s new André Obelink, MCSD – MVP MarYor | software & consultancy | ...

Post on 24-May-2015

223 views 1 download

Transcript of Visual Basic 2008 – What’s new André Obelink, MCSD – MVP MarYor | software & consultancy | ...

Visual Basic 2008 – What’s new

André Obelink, MCSD – MVPMarYor | software & consultancy

www.vbcentral.nl | www.obelink.com | www.maryor.nl

Me.About.ToString()

• MarYor | software & consultancy• 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• VP Speakers Bureau INETA Europe• Microsoft MVP voor Visual Basic sinds 2006

Wat niet aan de orde komt…

• 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

Wat wel aan de orde komt…

• Performance VB2008 ten opzichte van VB2005• Intellisense Everywhere• 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

Performance VB2008 ↔VB2005Scenario VB2005 (ms) VB2008 (ms) x Sneller

Builden grote projecten (background compilation) 222206.25 1352.88 164.25

Responsiviteit na toevoegen member aan class 327.00 36.50 8.96

Responsiviteit na openen van een project 255551.25 387969.38 6.59

Intellisense - eerste keer lijst types weergeven 1192.50 530.50 2.25

Edit-and-Continue in solution met XML comments 441.25 210.50 2.10

F5 indien solution al een keer is gebuild 385.20 278.70 1.38

Item toevoegen aan Error List bij maken fout 531.25 394.50 1.35

• Verdere performance verbeteringen- Debugger, projecten laden, …

Bron: Lisa Feigenbaum (VB team). Testmachine: Windows XP, Dual Core Pentium, 3.0 Ghz, 1 GB RAM

Intellisense

• Intellisense ‘everywhere’• Performance sterk verbeterd• Intellisence voor JavaScript, CSS en XML literals • Transparant met CTRL toets– onderliggende code zichtbaar

• VB: filtert het resultaat, waardoor lijst compacter

• VB: LINQ en Intellisense + tooltip hints

Visual Basic 9.0 – Design Goals

• 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– Breng structuur in documenten zonder schema– Maak creëren van XML documenten makkelijker– Vereenvoudig toegang tot XML elementen

Databronnen die LINQ ondersteunen

Language INtegrated Query (LINQ)

LINQTo

Objects

Objecten

LINQTo XML

<boek> <titel/> <auteur/></boek>

XML

LINQTo

Datasets

LINQTo SQL

LINQTo

Entities

Relationele data

LINQ binnen ADO.NET

Overige…VB C#

.NET Language-Integrated Query

DemoLanguage Integrated Query

De ‘magie’ achter LINQDim query = From proc In Process.GetProcesses _ Where proc.Threads.Count > 10 _ Select proc.ProcessName, proc.Threads.Count

Dim query = Process.GetProcesses(). _ Where(Function(proc As Process) proc.Threads.Count > 10). _ Select(Function(proc As Process) _ New With{.ProcessName = proc.ProcessName, _ .Count = proc.Threads.Count})

Function _Filter1(proc As Process) As Boolean Return proc.Threads.Count > 10Exit Function

Function _Projection1(proc As Process) As <AnonymousType> Dim projection As New <AnonymousType> projection.ProcessName = proc.ProcessName projection.Count = proc.Threads.Count Return projectionEnd Function

Query ExpressionsQuery pattern – Beschikbare Query Operators

Project Select <expr>

Filter Where <expr>, Distinct

Test Any(<expr>), All(<expr>)

Join <expr> Join <expr> On <expr> Equals <expr>

GroupGroup By <expr>, <expr> Into <expr>, <expr> Group Join <decl> On <expr> Equals <expr>Into <expr>

Aggregate Count([<expr>]), Sum(<expr>), Min(<expr>), Max(<expr>), Avg(<expr>)

Partition Skip [While] <expr>, Take [While] <expr>

Set Union, Intersect, Except (afwezig, echter makkelijk zelf te realiseren)

Order Order By <expr>, <expr> [Ascending|Descending]

Relationele data vandaag de dagDim connection As New SqlConnection(…)

connection.Open()

Dim cmd As New SqlCommand(“SELECT c.Name, c.Phone “ & _

“FROM Customers As c” & _

“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 telefoon as String = dr.GetString(1) Dim gebdatum As Date = dr.GetDateTime(2)End While

connection.Close()

Queries tussen aanhalingstekens

‘loosely bound’ argumenten

‘loosely typed’ resultaten

Geen controle tijdens compileren

Relationele Data met LINQPublic Class Customer …End Class

Public Class Northwind Inherits DataContext

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” Select cust.Name, cust.Phone

For Each custInfo in Contacts 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

DemoLinq voor relationele data – Linq to SQL

• From komt voor Select

Even wennen aan de ‘SQL’ syntax

Dim klanten = From klant in db.Customers _ Select klant.CustomerID,

klant.CompanyName

Nodig voor IntelliSense

Dim klanten2 = From klant in klanten _ Where klant.Name.StartsWith(“O”) _ Select klant.Name, klant.City

Dim klanten = From klant in db.Customers _ Select klant.Name, klant.City, klant.ZIP _ Order By ZIP, _

Select Name, City

• Veel vrijheid bij bouwen query Bouw opdrachten ‘regel voor regel’ …

… en over meerdere statements

Eventueel Select achterwege laten

• Expliciete aggregatie

• 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 _ Into OrderTotaal = Sum(sod.OrderQty *

sod.UnitPrice) _ Select CustomerID, OrderTotaal

Zogenaamde ‘Grouping Key’

Expliciete aggregatie

Imports System.Diagnostics

Dim procs = From proc In Process.GetProcesses() _ Aggregate thread In proc.Threads _ Into ThreadPriorityGemiddelde = Average(thread.CurrentPriority)

_ Select LijstProcessen = proc.ProcessName,

ThreadPriorityGemiddelde

Groep bestaat al

DemoLinq to XML – Maak XML

Maak XML - vandaag de dagDim doc As New XmlDocumentDim wns As XmlElement = doc.CreateElement("Werknemers")

For Each werknemer As Werknemer In werknemers If werknemer.Achternaam = "Jansen" Then Dim wn As XmlElement = doc.CreateElement("Werknemer") Dim BSN As XmlAttribute = doc.CreateAttribute("BSN") BSN.Value = werknemer.BSN : wn.Attributes.Append(BSN) Dim an As XmlElement = doc.CreateElement("Achternaam") an.InnerText = werknemer.Achternaam : wn.AppendChild(an) Dim voornaam As XmlElement = doc.CreateElement("Voornaam") voornaam.InnerText = werknemer.Voornaam : wn.AppendChild(voornaam)

wns.AppendChild(wn) End IfNext

doc.AppendChild(wns)

<Werknemers> <Werknemer BSN=“12345”>

<Achternaam>Jansen</Achternaam> <Voornaam>Piet</Piet> </Werknemer> …</Werknemers>

Imperatief model

‘Document centric’

Geen geïntegreerde queries

Geheugen intensief

LINQ to XML – Maak XML

Dim xml As New XElement("Werknemers", _ From w In werknemers _ Where w.Achternaam = "Jansen" _ Select New XElement("Werknemer", _ New XAttribute("BSN", w.BSN), _ New XElement("Achternaam", w.Achternaam), _ New XElement("Voornaam", w.Voornaam)))

Declaratief model

Geïntegreerde queries

‘Element centric’

Kleiner en sneller

DemoLinq to XML – Geïntegreerde XML binnen VB

Geïntegreerde XML binnen VB

Dim werknemersxml = _ <Werknemers> <%= From w in werknemers _ Where w.Voornaam = “Jan” _ Select <Werknemer> <Achternaam><%= w.Achternaam

%></Achternaam> <Voornaam><%= w.Voornaam

%></Voornaam> </Werknemer> %> </Werknemers>

Infers Xml.Linq XElement

Geen conceptuele barrière

‘Expression holes’ voor dynamische data / variabelen.

• Query expressions• XML literals• XML element access• Nullable types• Object initializers• Local type inference• Lambda expressions

Visual Basic 2008 - Features

• Extension methods• Expression trees• Anonymous types• Ternary operator• Coalesce operator• Relaxed delegates• Partial methods

Tot de tijd op is…Taaluitbreidingen die LINQ mogelijk maken, maar ook erg handig zijn voor eigen gebruik!

• Uitbreiden van bestaande datatypen– Plaats methode in module en in zelfde namespace– Markeer methode met <Extension()>

Extension methods

<Extension()> _Public Function Omdraaien(ByVal tekst As String) As String

Dim karakterArray() As Char = tekst.ToCharArray() Array.Reverse(karakterArray) Return New String(karakterArray)

End Function

Dim strNaam As String = “André”

Debug.Print strNaam.Omdraaien()

--------------ResultaatérdnA

• 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 …. End Property ….

End Class

Dim werknemer As New Werknemer() With {.BSN = “123”}

of …

Dim bestand As New FileInfo(“c:\test.txt”) _ With {.IsReadOnly = True, _ .CreationTime = Now}

• 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", _ .ISBN = 9789043014878}

boek.Titel &= " - Luxe Editie"

• 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)Next

Dim Verdubbel = Function(Getal As Integer) Getal * 2

MessageBox.Show(Verdubbel(5).ToString)MessageBox.Show(Verdubbel(13).ToString)

• 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– PrintForm, Printer Compatibility Library– Line en Shape Controls– Interop Forms Toolkit 2.0 MDI + User controls– DataRepeater Control

Visual Basic 2008 – Extra’s

Vragen?e-mail: andre@obelink.comweb: www.obelink.com | www.maryor.nl

HEROEShappen {here}

LaunchKit