Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei...

Preview:

Citation preview

Moderne Visual Basic-Programmierung

Peter Monadjemi

(BASIC- und VB-Fan der „ersten“ Stunde)

Bei Fragen rund um VB: pm@activetraining.de

Die Themen

Kurzer Rückblick

Auf dem Weg zur funktionalen Programmierung

Die neue Datenschicht: EF 4.1

(Kurzer Ausflug zu WPF + MVVM)

Neuerungen bei VB 11: Asynchrone Aufrufe und Iteratoren

Ausblick

Me.About(function(p) p.BasicJahre >30)

Beschäftige mich mit dem Thema „Programmierung“ seit ca. 1975 (zufällig das Jahr, in dem Microsoft gegründet wurde)

Meine ersten BASIC-Programme entstanden auf einem 8080

Meine erste Programmiersprache nach BASIC war FORTH (besitzt heute immer noch eine fanatische Anhängerschaft)

Später der übliche Werdegang (C64, ST 512, Comodore PC 10 usw.)

Wohne in Esslingen (am Neckar)

10: Print "Hallo, Welt“20: GoTo 10

Meine Anfänge als BuchautorDas Trainingsbuch zu Forth (1983)

Maschinenspracheprogrammierung (1986)

Das Visual Basic Kompendium 1.0 (1992)

Weitere VB-Bücher, Windows-Bücher usw.

Mein letztes Werk: Office 2010 mit Visual Studio

Das Visual Basic 2010 Kompendium steht noch aus

Ein kurzer Blick zurück (1)

Visual Basic 1.0 (1991)

• Windows-Programmierung für JedermannVisual Basic 3.0 (1994)

• Datenbankprogrammierung mit der Jet-Engine und dem Datensteuerelement

Visual Basic 4.0 (1996)

• Der Umstieg auf 32 Bit

Ein kurzer Blick zurück (2)

Visual Basic 5.0 (1997)

• Maschinencode statt P-CodeVisual Basic 6.0 (1998)

• Alles Wichtige stand zur Verfügung (aber auch ein paar überflüssige Dinge, wie ActiveX Documents)

Mit .NET kam der große Bruch

• Visual Basic wurde als Sprache komplett neu entwickelt und in Visual Studio integriert

• Übrig blieb: Microsoft.VisualBasic.dll

Auch unter .NET gab es eine Entwicklung

Visual Studio .NET 2002/2003 waren noch sehr rudimentär

Mit Visual Studio 2005 kamen wichtige Verbesserungen speziell für die VB-Community:

>Der My-Namespace

>Windows Forms-Datenbindung

>Änderungen während einer Programmunterbrechung

>Der Aktualisierungsassistent wurde leicht verbessert

usw.

Mit Visual Studio 2008 SP1 kamen ASP.NET MVC und das Entity Framework

Mit Visual Studio 2010 kommt u.a. ein halbwegs brauchbarer WPF-Designer

Was heißt modern?

Das Gegenteil von moderner Programmierung ist nicht altmodische Programmierung

Modern bedeutet für mich:

Die Möglichkeiten der Sprache, des .NET Frameworks (der Laufzeit) und von Visual Studio zu kennen, um sie bei Bedarf einsetzen zu können

Es ist in Ordnung Lambdas nicht zu mögen (etwa unter dem Aspekt der Lesbarkeit)

Es ist nicht in Ordnung nicht zu wissen, was ein Lambda ist und welche Möglichkeiten er bietet

Schwerpunkte bei .NET 4.0, die für Visual Basic-Entwickler wichtig sind

1Lambdas

2LINQ

3Entity

Framework

4WPF/Silverlight

MVVM

6Asynchrone

Aufrufe

5Task

ParallelLibrary

Grundlage für alles: Die Programmiersprache

Typinferenz

Automatische Properties

Collection- und Array-Initialisierer

Anonyme Typen

XML-Literale

Nullable Typen und Null-Weitergabe

Erweiterungsmethoden

usw.

Typinferenz (Version 9.0)Der Compiler kann den Typ einer lokalen Variablen aus der Zuweisung ableiten

Praktische Abkürzung, an die man sich gewöhnen muss

Ist vor allem bei LINQ-Abfragen wichtig

Ging das nicht früher (z.B. VB2005) auch schon?

Dim Zahl = 1234Dim GebDatum = "25.10.1963"

Beispiel

Int32 DateTime oder String?

Automatische Properties (Version 10.0)

Properties können vereinfacht definiert werden

Es wird automatisch ein privates Feld angelegt

Property Email As String

Beispiel

Collection- und Arrays-Initialisierer (Version 10.0)

Eine Collection kann bei der Deklaration mit Werten belegt werden (sehr praktisch)

Auch für Arrays gibt es etwas Neues

Beispiel

Dim Spieler = New List(Of Spieler) From { New Spieler With { .Name = "Spieler1"}, New Spieler With { .Name = "Spieler2"} }

Neues Schlüsselwort

Dim Zahlen = {11, 22, 33, 44}

Beispiel

Integer()Dim Matrix = {{11,111}, {22,222}, {33,333}, {444,44}}

Integer(,)

Anonyme Typen (Version 9.0)Ein Typ, der nicht explizit definiert werden muss

• Und vom Compiler einen "unaussprechlichen" Namen erhält

Beispiel

Dim P = New With {.Name = "Pemo", .Alter = 44 }

VB$AnonymousType_0`2

XML-Literale (gibt es nicht bei C#)XML-Code kann direkt in den Quellcode eingefügt werden

Beispiel

Dim HTML = <HTML> <HEAD> <TITLE>Ein kleiner Test</TITLE> </HEAD> <BODY> <H1>XML-Literale in VB</H1> <%= From z In Enumerable.Range(1, 12) Select <LI><%= MonthName(z) %></LI> %> </BODY> </HTML>My.Computer.FileSystem.WriteAllText("Test.html", HTML.ToString(), False, System.Text.Encoding.Default)Process.Start("Test.html")

XElement-ObjektEingebetteter Ausdruck

Null-fähige Typen und Null-Weitergabe (Version 9.0)Auch ValueType-Variablen können keinen Wert besitzen

Praktisch im Zusammenhang mit Entity Framework• Besitzt eine Property einen Nullable-Typ lässt sich abfragen,

ob sie aus dem DB-Feld einen Wert erhalten hat

Beispiel

Class Person Property Name As String Property Alter As Integer?End Class

Dim P As New Person With {.Name="Pemo" }If P.Alter.HasValue Then

False

Nullable Type

Null-fähige Typen und Null-Weitergabe (Version 9.0)Null-Werte werden weitergeben (engl. null propagation)

Beispiel

Dim a As Integer? = NothingDim b As Integer? = 123Dim c = a + b

Wird zu einem Nullable-Type (Integer?) und besitzt (als ValueType) den Wert Nothing (ansonsten 123, da der Null-Wert dann nicht weitergeben wird)

Erweiterungsmethoden (engl. extension methods)

Jede Klasse kann nachträglich um statische Methoden erweitert werden

Methode wird in einem Modul definiert und mit dem Extension-Attribut (System.Runtime.CompilerServices) dekoriert

Zuordnung zu einer Klasse geschieht über den Typ des 1. Methodenparameters

Praktisch, da die Aufrufsyntax konsistent bleibt

Extension-Methode-BeispielModule StringEx

<Extension()> Function FirstToUpper(ByVal s As String) As String Return Mid(s, 1, 1).ToUpper() & s.Substring(1, s.Length - 1).ToLower() End Function

End Module

String-Klasse wird erweitert

Erweiterungsmethode

String beginnt bei 0

Weitere "Sprachneuerungen" (1)Relaxed Delegates

• Für einen Prozedur-Delegaten mit Parametern kann eine parameterlose Prozedur eingesetzt werden

Beispiel

Sub Button1_Click()

End Sub

Event-Handler für das Click-Event – die Parameter Sender und e können entfallen

Weitere "Sprachneuerungen" (2)

Covarianz und Contravarianz

Varianz – die Möglichkeit z.B. bei einer generischen Liste den Typ variieren zu können, wenn der neue Typ in einer "Ist abgeleitet"- oder "Leitet sich ab"-Beziehung zu dem Originaltyp steht

Spielt in der Praxis eher selten eine Rolle

Führt zu weniger InvalidCastExceptions

Beispiel für CovarianzModule Module1 Sub Main() Dim ListeSpezial As New List(Of Spezial) From {New Spezial, New Spezial, New Spezial} Dim ListeEinfach As IEnumerable(Of Einfach) = ListeSpezial Console.ReadLine() End SubEnd Module

Class EinfachEnd Class

Class Spezial : Inherits EinfachEnd Class

Führt bei .NET 3.5 zu einer Exception

Bei ,NET 4.0 ein Out-Interface

Public Interface IEnumerable(Of Out T)

Mehr auf MSDN

Lambdas (Schwerpunkt 1)

Lambda = Funktion- oder Prozedur ohne Funktions-/Prozedurkopf

• Weiterentwicklung der anonymen Methoden von C#, die es bei VB nie gegeben hat

• Der Begriff kommt von Lambda Calculus (ʎ)

Vorteile:• Mehr Flexibilität, wenn Funktionscode als

Parameter eingesetzt werden soll• Funktionscode kann wie Daten behandelt werden

(und z.B. einer Variablen zugewiesen werden)• Grundlage für LINQ

Lambdas (2)Function und Sub können auch rechts vom = stehen

Ein Lambda ist vom Typ Func(Of T)

Können dort eingesetzt werden, wo ein Action(Of T)- oder Predicate(Of T) –Delegat erwartet wird

Ein

sieht etwas ungewöhnlich aus (und bringt auch keine Vorteile für die Programmierung;)

Dim Msg = Sub() Msgbox ("Hallo")Msg()

Anonymer Delegat

Lambdas (3)Manches erscheint auf den ersten Blick etwas ungewöhnlichClass Person Property Name As String Property Active As BooleanEnd Class

Dim CheckActiveUser As Func(Of Person, Boolean) = Function(p) p.Active

Dim Personen As new List(Of Person) From {...}Dim AktivePersonen1 = Personen.Where(CheckActiveUser)

Dim AktivePersonen2 = Personen.Where(CheckActiveUser).ToArray()

WhereListIterator-Objekt

Array

Function auf der rechten Seite

Delegat-Typ

DoEvents-Ersatz für WPFIn C#

Wie um alles in der Welt schreibt man das in VB?

public static void DoEvents() { Application.Current.Dispatcher.Invoke( DispatcherPriority.Background, new ThreadStart(delegate { }));}

Anonyme Methode in C#

Sub DoEvents() Application.Current.Dispatcher.Invoke( DispatcherPriority.Background, Sub() End Sub)End Sub

Die LösungEinfach einen passenden Delegaten definieren

Delegate Sub UpdateListBox(ByVal z As Integer)

Dim T1 As New Task(Sub() For n = 1 To 100 ListBox1.Dispatcher.Invoke(New UpdateListBox(Sub(z) ListBox1.Items.Add(z) End Sub), n) Next End Sub)T1.Start()

Delegat wird instanziert

LINQ (Schwerpunkt 2)

Löst das "Impedanzproblem" elegant und entwicklerfreundlich

(Datenbank-) daten können direkt im Programmcode angesprochen werden

Nicht wirklich neu (erste CTP gab es im Mai 2006!)

Seit .NET 4.0 kann jede LINQ-Abfrage auch parallel ausgeführt werden

• Einfach ein AsParallel() anhängen

LINQ (1)Ist über Sprachvereinfachungen sowohl Teil der Programmiersprache als auch des .NET Framework (ab Version 3.5)

Join mit Sprachvereinfachung

Dim AuftraegeKundenPLZ7 = From k In Kunden Join a In Auftraege On k.KundenNr Equals a.KundenNr Where k.PLZ.StartsWith("7") Select New With {.AuftragNr = a.AuftragNr, .PLZ = k.PLZ}Join ohne Sprachvereinfachung

Dim AuftraegeKundenPLZ7 = Kunden.Join(Auftraege, Function(k) k.KundenNr, Function(a) a.KundenNr, Function(k, a) New With {.AuftragNr = a.AuftragNr, .PLZ = k.PLZ}).Where(Function(a) a.PLZ.StartsWith("7"))

Reguläre Collection

LINQ (2)

LINQ funktioniert mit allen Collections/Arrays

Eine LINQ-Abfrage steht nicht für das Ergebnis, sondern für die Abfrage

• Lazy Loading (Abfrage wird erst bei der Auswertung ausgeführt)

• Ergebnis wird implizit/explizit z.B. in ein Array konvertiert

Es gibt über 40 Erweiterungsmethoden, wie z.B. Group, Count, Select, Where usw.

• Stammen von den Klassen Enumerable(Of T) und Queryable(Of T)

LINQ (3)Visual Basic bietet knapp ein Dutzend Abfragevereinfachungen

from, where, select, aggregate, distinct, group, join, order by, take, skip, let

Ein einfaches Beispiel

Dim AktiveUser = From u In User Where u.IsActive Select u

Keine Collection,Sondern "Iterator" –Abfrage wird "verzögert"AusgeführtIterator liefert im Rahmen einer For Each-Schleife beiJedem Durchlauf dasnächste Objekt

Damit beginnt Jede Abfrage

Lokale Variablebezogen auf denAusdruck

Collection mitUser-Objekten

Abfragevereinfachung

Projektion, die denRückgabetyp festgelegt(optional)

Entity Framework (Schwerpunkt 3)

Entity Framework – der offizielle ORM von Microsoft

ORM = Objektrelationaler Mapper

Objekte können direkt in einer Datenbank gespeichert werden (Persistenz)

Der ORM kümmert sich um Details wie Vererbung, Collections, Primärschlüssel-Beziehungen und das "Mappen" auf Datenbanktabellen

EF 1.0 als Teil von .NET 3.5 SP1

Mit .NET 4.0 ist EF funktional reichhaltig genug

Ohne EF ist alles zwar vertraut, aber etwas umständlich

Abrufen der Employees-Datensätze und Mappen auf Objekte

Dim Employees As New List(Of Employee)Using Cn As New SqlConnection(My.Settings.NwCn) Cn.Open() Dim Cmd As SqlCommand = Cn.CreateCommand() Cmd.CommandText = "Select EmployeeID, LastName From Employees" Dim Dr As SqlDataReader = Cmd.ExecuteReader() While Dr.Read() Dim emp As New Employee With { .ID = Dr.ReadInt32(Dr.GetOrdinal("EmployeeID")) .LastName = Dr.ReadString(Dr.GetOrdinal("LastName")) Employees.Add(emp) End While Cn.Close()End Using

Mit EF wird alles sehr einfachAbrufen der Employees-Datensätze

Wäre nicht erforderlich, da DBContext bereits die Datensätze als Collectionzur Verfügung stellt

Neuen Datensatz anhängen

Using NwContext As New DBContext(My.Settings.NwCn) Dim empNeu As New Employee empNeu.LastName = "Monadjemi" NwContext.Employees.Add(empNeu) NwContext.SaveChanges()End Using

Using NwContext As New DBContext(My.Settings.NwCn) EmployeesCol = NwContext.Employees.ToList()End Using

Mit EF 4.1 gibt es Code First

Separater Download (seit Mai)

Code First – Datenbank wird direkt aus dem Klassenmodell abgeleitet

Weder ein separates Mapping noch der Entity Designer sind im Spiel

Sehr praktisch für alle Situationen, in denen Objekte (POCOs = Plain Old CLR Objects) einfach nur "persistiert" werden sollen

Beispiel für Code-First bei EF 4.1 (1)

Class Person Property Name As StringEnd Person

Class Mitarbeiter : Person <Key()> Property MitarbeiterID As IntegerProperty Reservierungen As Ienumerable(Of Reservierung) Property EinstellDatum As DateTimeEnd Class

Class Reservierung <Key()> Property ReservierungID As Integer Property MitarbeiterID As IntegerEnd Class

Class VBHotelContext : Inherits DBContext Property Mitarbeiter As DBSet(Of Mitarbeiter) Property Reservierungen As DBSet(Of Reservierung)End Class

Klassen besitzen keine Abhängigkeiten

Beispiel für Code-First bei EF 4.1 (2)Anlegen und Persistieren von Objekten

Sub Main Using Db As New VBHotelContext Dim m As New Mitarbeiter With { .Name = "Pemo", .EinstellDatum=Now } Db.Mitarbeiter.Add(m) Db.SaveChanges() End UsingEnd Main

Abfragen von Objekten

Sub Main Using Db As New VBHotelContext Dim NeueMitarbeiter = From m in Db.Mitarbeiter Where m.EinstellDatum > "1.1.2011" Select m End UsingEnd Main

Legt Datenbank via App.config an

EF 4.1 – Die Struktur der Datenbank

Namensvergabe kannüberschrieben werden

MVVM bei WPF und Silverlight (Schwerpunkt 4)

MVVM = Model View ViewModel

• Abgeleitet aus dem klassischen MVC-Muster (Movel View Controller)

Spielt (wegen Datenbindung) nur bei WPF, Silverlight und WP7 eine Rolle

Sinnvolle Abstrahierung der Benutzeroberfläche (Window, UserControl) von den Klassen, die die Daten zur Verfügung stellen

MVVM (1)

Model – eine klassische Datenklasse

ViewModel – kapselt die Datenklasse und macht sie bindungsfähig

View – stellt eine Sicht auf die Datenklasse dar, dessen Daten über das ViewModel gebunden werden

MVVM - Vorteile

Gibt (endlich) eine Antwort auf die Frage, wie eine Anwendung mit Benutzeroberfläche strukturiert wird

Seit Jahren bewährter Ansatz

• Praxiserprobt und "Tausendfach" modifiziertUnterstützung durch Frameworks

Im Grunde für WPF- und Silverlight-Anwendungen der einzige Ansatz

MVVM - Nachteile

Wirkt teilweise recht komplex (ist es aber nur bedingt)

Lernaufwand ist am Anfang sehr groß

Vorteile wirken sich nicht immer direkt aus

Man muss MVVM bereits sehr gut verstanden haben, um keine "Designfehler" zu machen und sich nicht in eine Ecke zu manöverieren

Keine Unterstützung durch Microsoft für WPF (aber für Silverlight)

MVVM lernen

Der Einstieg ist nicht ganz leicht

Es gibt viele Tutorials (auch mit VB-Code)

Wenn sich MVVM-Experten austauschen wird es sehr schnell kompliziert

Trotzdem ist MVVM nicht schwer zu erlernen

• Die größte Herausforderung besteht am Anfang darin, den "Sinn" zu erkennen und den Mehraufwand zu akzeptieren

Asynchrone Aufrufe (Schwerpunkt 5)

So war es bislang

So wird es mit Visual Basic 11 sein

Ebenfalls neu bei VB11: Iteratoren

So war es bislang…

Asynchrone Aufrufe sind schwierig zu implementieren

• Expliziter Callback erforderlich• Programmlogik wird "zerstückelt"• Threadübergreifender Zugriff von einer asynchron

ausgeführten Methode etwas problematisch• Exception-Handling wird meistens ignoriert

Viele VB-Entwickler ließen bislang lieber die Finger davon

Asynchrone Aufrufe – Lösungsansätze

Es gibt verschiedene Lösungsansätze:• Begin<Operation>/End<Operation>-Entwurfsmuster

aus .NET 1.x (z.B. FileStream-Klasse)• Auslagern auf einem Backgroundthread aus dem

Threadpool• Asynchrone Aufrufe über Delegaten, BeginInvoke und

einem Callback• Einige wenige.NET-Methoden sind von Haus aus

asynchron und melden sich über ein Event (z.B. DownloadStringAsync der WebClient-Klasse)

• Die BackgroundWorker-Komponente (der einfachste Ansatz)

Asynchrone Aufrufe – Schwachpunkte der vorhandenen Ansätze

Erhöhter Implementierungsaufwand

Viele Entwickler schrecken vor Delegaten, asynchronen Callbacks zurück (wirken kompliziert)

• Was ist mit vorzeitigem Abbruch oder einer Fortschrittsmeldung?

Die Programmlogik muss angepasst werden

Threads kosten Ressourcen (1 Mbyte Arbeitsspeicher pro Thread)

Asynchrone Aufrufe – Neu: TAP

TAP – Task-based asynchronous Patterns

Empfehlung von Microsoft für die Umsetzung und den asynchronen Aufruf beliebiger Methoden

Unbedingt das White-Paper lesen

http://www.microsoft.com/download/en/details.aspx?id=19957

Asynchrone Aufrufe – TAP im Detail (1)

Basiert auf den mit .NET 4.0 eingeführten Tasks

• Ein Task steht für eine Operation (Methode), die vom Task Scheduler ausgeführt wird

Es gibt nur ein Methode• Namenskonvention: <Operation>TaskAsync• Gibt immer ein Task- bzw. Task(Of T)-Objekt zurück

Asynchrone Aufrufe – TAP im Detail (2)

Die TaskAsync-Methode kehrt „sofort“ zurück• Der Initialisierungscode (sofern vorhanden) wird

synchron ausgeführt• Die Rückgabe ist immer ein Task-Objekt• Der Hauptteil wird asynchron ausgeführt, das

Ergebnis wird über das Task-Objekt zur Verfügung gestellt

• Exceptions werden ebenfalls über das Task-Objekt zur Verfügung gestellt

• Ein TaskAsync-Methode kann über ein CancellationToken jederzeit abgebrochen werden

Asynchrone Aufrufe – ein Beispiel für eine TAP-Methode

Dim T = Wc.DownloadStringTaskAsync("http://basta.net")Dim Content = Await T

Dim Content = Await Wc.DownloadStringTaskAsync("http://basta.net")Befehl1Befehl2

Eine TaskAsync-Methode gibt ein Task(Of T)-Objekt zurück

Task(Of String)

Ohne den Umweg über eine Task(Of T)-Variable

Nicht blockierend

Werden über einen Callback erst nach Beendigung des Tasks ausgeführt

Beispiel mit .NET 4.0Asynchroner Download mehrerer Webseiten

Private Function SumWebPages(Uris As List(Of Uri)) As Integer Dim total As Integer For Each Uri In Uris Dim Wc As New WebClient AddHandler Wc.DownloadDataCompleted, Sub(sender, e) total += e.Result.Length Console.WriteLine("Das Ergebnis ist da - neue Gesamtgröße: {0:n0}", total) End Sub Console.WriteLine("Prüfe: {0}, Aktuelle Größe: {1:n0}", Uri.AbsoluteUri, total) Wc.DownloadDataAsync(Uri) Next Return totalEnd Function

Einfacher Asynchroner Aufruf, aber was istmit dem Kontrollfluss?

Lambda als Event-HandlerLambda als Event-Handler

So wird es mit VB 11 sein

Asynchroner Download mehrerer Webseiten

Private Async Function SumWebPages(Uris As List(Of Uri)) As Task(Of Integer) Dim total As Integer = 0 For Each Uri In Uris Dim Data = Await New WebClient().DownloadStringTaskAsync(Uri) total += Data.Length Console.WriteLine("Prüfe: {0}, Aktuelle Größe: {1:n0}", Uri.AbsoluteUri, total) Next Return totalEnd Function

Compiler macht darauseinen Task, der alsCallback ausgeführt wird

Async und Await sind neu bei VB11

Neu bei .NET 4.5

Die Rolle von Await (1)

Neuer Operator in VB 11

Kann nur in Subs/Functions eingesetzt werden, die mit Async deklariert sind (=asynchrone Methode)

Wartet auf das Resultat des gestarteten Tasks, ohne den Thread zu blockieren

Await „splittet“ die Methode in zwei Abschnitte auf

• Abschnitt 1 legt den Task an und kehrt zurück• Abschnitt 2 umfasst die auf Await folgenden Befehle,

die über einen Callback aufgerufen werden

Die Rolle von Await (2)

Async Sub Test() Dim z = Await TuWas() Console.WriteLine(z)End Sub

Async Function TuWas() As Task(Of Integer) Await TaskEx.Delay(5000) Return Await TaskEx.Run(Of Integer)(Function() Return 1234 End Function)End Function

Wird nach Beendigung des Tasks ausgeführt

Beispiel: Asynchroner RSS-Reader

WPF-Anwendung

RSS-Feeds werden über DownloadStringAsyncTask heruntergeladen

Abbruch jederzeit möglich

Fortschrittsanzeige über IProgress-Schnittstelle

Mehrere Tasks zusammenfassenVorher: WhenAll fasst mehrere Tasks zu einem Task zusammen

Async Sub DownloadUrls() Dim UrlListe() = {"http:/www.heise.de", "http:///www.basta.net", "http://dotnet.de", "http://msnd.com"} Dim AlleTasks As IEnumerable(Of Task) = From url In UrlListe Select TuWasAsync(url) ' Genial: WhenAll fasst alle Tasks zu einem neuen Task zusammen und Await wartet, dass alle Tasks fertig sind Await TaskEx.WhenAll(AlleTasks) Console.WriteLine("Alle Tasks haben fertig...")End Sub

Async Function TuWasAsync(Url As String) As Task(Of Boolean) Await TaskEx.Run(New Action(Sub() Console.WriteLine("Verarbeite {0} auf Thread-ID: {1}", Url,

Thread.CurrentThread.ManagedThreadId) Thread.Sleep(5000) End Sub)) Return TrueEnd Function

Thread aus ThreadpoolKünstliche VerzögerungHilfsklasse der Async CTP

Genial: Methodenaufruf, der ein Task-Objekt liefert, aus der LINQ-Abfrage herausl

Asynchron ist wichtig

Fenster sollen reaktionsfreudig bleiben

Webinhalte (z.B. Webservices) sollten generell asynchron abgefragt werden

Wichtig: Die asynchronen Aufrufe erfolgen nicht automatisch auf einem Backgroundthread

Iteratoren

Was ist ein Iterator?

Ein Beispiel zur Einstimmung

Weitere Beispiele

Was ist ein Interator?

Iterator = Funktion vom Typ IEnumerable(Of T), die wie eine Collection durchlaufen wird

Wird mit dem neuen Iterator-Schlüsselwort implementiert

Ein Wert wird über den neuen Yield-Befehl zurückgegeben

Vorteil: Die Rückgabe der einzelnen Werte lässt sich steuern

Vorteil: Generell mehr Flexibilität

Der LINQ-Effekt: Sobald man sich daran gewöhnt hat, verwendet man es bei der jeder Gelegenheit

Iteratoren – ein Beispiel zur Einstimmung

Beispiel: Ein Range-Methode gibt einen Zahlenbereich zurück

Variante A:

Dim Zahlen = Range1(4, 10) Iterator Function Range1(Min As Byte, Max As Byte) As IEnumerable(Of Byte) For i = Min To Max Yield i NextEnd Function

Variante B:

Function Range2(Min As Byte, Max As Byte) As IEnumerable(Of Byte) Return Iterator Function() For i = Min To Max Yield I Next End Function.Invoke()End Function

Iteratoren – mit einem Lambda

Beispiel: Ein Lambda-Iterator gibt einen Zahlenbereich zurück

Dim Zahlen = Iterator Function(min As Integer, max As Integer) For i = min To max Yield i Next End Function.Invoke(4, 5)

Aufruf des Lambda

Iteratoren und Inline-XMLBeispiel: Ein Lambda-Iterator gibt einen Zahlenbereich zurück

Dim RSS = <?xml version="1.0"?> <RSS> <chanell> <%= Iterator Function() For Each M In Meldungen Yield <item> <title><%= M.Titel %></title> <date><%= M.Zeitpunkt.ToShortDateString()></date> </item> Next End Function.Invoke() %> </chanell> </RSS>

XElement-Objekt

Xdocument-Objekt Lambda-IteratorCollection mit Meldung-Objekte

Iteratoren – Weitere Beispiele

Implementierung einer einfachen State-Machine

Durchlaufen eines Baums

Entwickeln für Windows 8

Neu: Windows Runtime anstelle von .NET Runtime

Metro Style-Anwendungen als neuer Anwendungstyp

Die Rolle von Visual Basic

Die Windows Runtime (Windows RT)

Laufzeit für Windows 8 Metro Style-Anwendungen

Umfasst ca. 1.800 Klassen

Kapselt viele Win32-API-Funktionen

Wird über COM-Schnittstellen angesprochen (IUnknown ist zurück)

Über „Projections“ Schnittstellen zu NET, C++ usw.

Es gibt eine .NET-Metro-Klassenbibliothek (Metro Style Profile)

• Der Name ist .NET for Metro Style Apps• Teilmenge der .NET-Klassenbibliothek• Teilweise nicht kompatibel (andere Typen- und

Membernamen)

Das neue Anwendungsmodell

Metro Style Apps

Neues Oberflächenmodell - das erste seit Windows 95 (!)

Im Mittelpunkt stehen die mit der Windows Phone 7-Oberfläche (Metro) eingeführten Kacheln

Kacheln – Einstiegspunkt für eine Anwendung

Optimiert für Touch-Oberflächen

Die Rolle von Visual Basic

Windows 8 enthält die .NET 4.5-Laufzeit

Entwickelt wird mit VS 11 bzw. VS 11 Express Edition

Zahlreiche Vorlagen

Oberfläche wird in XAML definiert

Silverlight-Apps können mit geringem Aufwand umgestellt werden

Anwendungen werden nach wie vor von der CLR (4.5) ausgeführt

Verbesserungen bei .NET 4.5 und VS 11

Neue Klassen, z.B. HttpClient

Implementierung des Task-based Asynchronous Pattern

Neuer WPF- und Silverlight-Designer

• Der Designer aus Expression Blend wurde in die Visual Studio-IDE „eingepflanzt“

Wichtige Verbesserungen beim Thema Application Life Cycle Management (ALM)

Roslyn – Compiler als Service

Die Compiler-Infrastruktur wird aufgebohrt und ihre Funktionalitäten werden über Klassen zur Verfügung gestellt

Entwickler können sich damit eigene Syntaxparser oder Codegeneratoren schreiben

Seit Oktober 2011 gibt es eine erste CTP – möglicherweise Teil des Nachfolgers von .NET 4.5

Roslyn – viele neue Möglichkeiten für VS-Erweiterungen

• Die Compiler-Klassen standen bei .NET schon immer zur Verfügung • Namespace System.CodeDom.Compiler• Damit lässt sich zur Laufzeit Quellcode in eine Assembly

kompilieren und ausführen

• Roslyn bietet einen Zugriff auf die einzelnen Phasen der Kompilierung und den resultierenden Syntaxbaum, der das kompilierte Programm repräsentiert

• Neben einer Syntaxanalyse ist eine auch eine semantische Analyse des Codes möglich

Roslyn – Beispiele aus der CTP

VisualBasicToCSharpConverter• Konvertiert VB-Code nach C#

RemoveByValVB• Entfernt überflüssige ByVal`s

OrganizeSolutionVB• Sortiert Import-Anweisungen

ConvertToAutoPropertyVB• Konvertiert „leere“ Property-Definitionen in Auto-

Properties

ScriptingIntro (aktuell nur C#)• C#-Shell mit einem C#-Intepreter

Tools, die VB-Entwickler kennen sollten

FxCop (Microsoft)• Programmcode-Analyse auf der Basis von Regeln

Refactor! (DevExpress)• Umgestalten lassen des Quellcodes

LINQPad• Genial zum Ausprobieren von LINQ-Abfragen

ILSpy• "Nachfolger" von der freien Version von Reflector

Mole (keine Freeware)• Genialer Visual Studio-Visualizer

Der Nuget-Package Manager

Seit Januar 2010 verfügbar

Auf der PowerShell basierendes Konsolenfenster für Visual Basic für das Installieren von Packages

Package = Sammlung von Assemblies, die einem Projekt hinzugefügt werden sollen

Es gibt inzwischen Tausende von Packages

• Von Log4Net bis Entity Framework 4.1

Quellcodeverwaltung

Es gibt viele Alternativen

Meine Empfehlung:

>Subversion (SVN) (z.B. TortoiseSVN)

>VS-Integration über Akhsn

>VSN-Client

>Projektportal zum Hosten, z.B. unfuddle.com

>Demnächst: TFS Express Edition

Co-Evolution

„VB und C# werden in Zukunft gemeinsam weiterentwickelt“

Anders Hejlsberg, Distinguished Engineer bei Microsoft (und „Vater“ von Turbo Pascal und Delphi) im Juni 2009

C# nähert sich VB an

Über das dynamic-Schlüsselwort ist eine späte Bindung möglich

Optionale und benannte Argumente bei Methoden

C# hat damit VB „eingeholt“ - lediglich „Inline-XML“ gibt es nicht

VB nähert sich C# an

Ein – und mehrzeilige Lambdas

Einzeilige Properties

Collection-Initialisierer

Mit VB11 auch Iteratoren

Ein paar Kleinigkeiten fehlen, z.B. ein direktes Pendant zum delegate-Befehl und den anonymen Methoden (Lambdas bei VB)

delegate int FunDel(int x1, int x2);FunDel f1 = delegate(int p1, int p2) { return p1 + p2;};

VB hat aufgeholt

XNA 4.0 – DirectX-Spiele können auch in VB entwickelt werden

.NET MicroFramework ab Version 4.2 – VB-Code läuft auf kleinen RISC-CPUs

Microsoft Surface 2.0 SDK enthält VB-Beispiele

Windows Phone 7 – VB-Code läuft (unter Silverlight) auf einem SmartPhone

Im Rahmen von Silverlight läuft VB-Code auch unter Mac OS X

Es gibt keine Abhängigkeit zur VB-Laufzeit (Namespace Microsoft.VisualBasic) mehr

Ein Blick in die nähere Zukunft

Das Innovationstempo wird sich bei der Sprache sicherlich verlangsamen

Die „wir müssen die VB6-Entwickler zurückgewinnen“-Phase ist bei Microsoft wieder vorbei

Alle wichtigen Sprachelemente sind implementiert

Die Möglichkeit jede Methode asynchron aufrufen zu können ist ein wichtiger Schritt in die richtige Richtung - vor allem für VB-Entwickler

Ansonsten: Wer braucht weitere Features? Die aktuell vorhandene Funktionalität ist mehr als ausreichend

Die Zukunft von Visual Basic…

Sieht trotz alledem grundsätzlich gut aus

Visual Basic wurde im Mai 20 Jahre alt (!)• Tipp:

http://blogs.msdn.com/b/vbteam/archive/2011/05/20/happy-20th-birthday-visual-basic.aspx

Co-Evolution sorgt dafür, dass VB die Features von C# erhält

Die Async-Vereinfachung wird die VB-Programmierung stark beeinflussen

Jetzt ist der Zeitpunkt, sich mit der der VS 11 Preview zu beschäftigen

Recommended