View
106
Download
1
Category
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