Post on 24-May-2015
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