Moderne Visual Basic-Programmierung

Slides:



Advertisements
Ähnliche Präsentationen
Be.as WEB Technologie
Advertisements

C Sharp (C#) Martin Saternus Senior Student Partner
Programmierung II Prof. Dr. Michael Löwe
SQL Server 2005.NET Integration Sebastian Weber Developer Evangelist Microsoft Deutschland GmbH.
Was ist neu in VS 2003 ? Ein Überblick. Bernd Marquardt Software & Consulting
Objektorientierung mit VBA
Universität Stuttgart Institut für Kernenergetik und Energiesysteme Was ist Refactoring? Bevor man die Integration angeht, mag es angebracht sein, den.
FH-Hof Einbindung von JavaScript Anweisungen
Java: Objektorientierte Programmierung
Java: Dynamische Datentypen
Indirekte Adressierung
Java: Referenzen und Zeichenketten
Java: Grundlagen der Objektorientierung
Konstruktoren.
Polymorphie (Vielgestaltigkeit)
Dynamischer Speicher. In einer Funktion wird z.B. mit der Deklaration int i; Speicher auf dem sogenannten Stack reserviert. Wenn die Funktion verlassen.
XINDICE The Apache XML Project Name: Jacqueline Langhorst
Oracle PL/SQL Server Pages (PSP). © Prof. T. Kudraß, HTWK Leipzig Grundidee: PSP – Internet-Seiten mit dynamischer Präsentation von Inhalten durch Einsatz.
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Listen-
Programmieren mit JAVA
PRJ 2007/1 Stefan Dissmann Motivation Problem: gleiche Datenstrukturen werden für verschiedene Objekte gebraucht: z.B. Listen von Studierenden, Kunden,
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Bisher im Kurs erarbeitete Konzepte(1): Umgang mit einfachen Datentypen Umgang mit Feldern Umgang mit Referenzen.
Zusammenfassung Vorwoche
PKJ 2005/1 Stefan Dissmann Klassenhierarchie Person Kunde Goldkunde Lieferant Object.
Software Design Patterns Extreme Programming (XP).
Einführung in Visual C++
DVG Klassen und Objekte
EDV Parallelprogrammierung1 Parallelprogrammierung mit JAVA.
Einführung in die Programmierung Datensammlung
Hänchen & Partner GmbH 1 Web-Anwendungen mit dem Jakarta Struts Framework 3.Juli 2003 Martin Burkhardt.
Visual FoxPro 10.0 Visual Extend 10.0
Uwe Habermann Venelina Jordanova dFPUG – Silverlight Wizard.
Uwe Habermann WPF Avalon Formulare aus VFP verwenden Venelina Jordanova
Marcus Haller & René Schulze
Presenter: Daniel Walzenbach Technologieberater
MSDN Webcast: VB.NET für Einsteiger und Umsteiger, Teil 10 Die erste, eigene Klassenbibliothek (Level 100) Presenter: Daniel Walzenbach Technologieberater.
Presenter: Daniel Walzenbach Technologieberater
MSDN Webcast: VB.NET für Einsteiger und Umsteiger, Teil 9 Zeichenketten, Delegates und Events (Level 100) Presenter: Daniel Walzenbach Technologieberater.
Was umfaßt die CORBA Core Spezifikation? Welche zusätzlichen Komponenten muß ein ORB Produkt beinhalten? Core: CORBA Objekt Modell CORBA Architektur OMG.
Peter Monadjemi | ActiveTraining
Wir bauen uns eine Webapplikation!
Silverlight Eine Einführung. Agenda 1.Was ist Silverlight? 2.Die Silverlight Philosophie 3.Vorstellung des Szenarios 4.Einführendes Beispiel 5.Konzepte.
Einführung / Geschichte Einführung / Geschichte Motivation Motivation Beispiel Beispiel Architektur / Komponenten Architektur / Komponenten Konfiguration.
SQL Server 2005 CLR-Integration
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
BIT – Schaßan – WS 02/03 Basisinformationstechnologie HK-Medien Teil 1, 11.Sitzung WS 02/03.
Your name Bedeutung von Internet- Technologien Gruppe 1 Andreas Feuerstein Philipp Hochratner Christian Weinzinger.
Windows Presentation Foundation WS 2013/14 Prof. Dr. Herrad Schmidt
Windows Presentation Foundation, Vorlesung Wintersemester 2013/14 Prof. Dr. Herrad Schmidt WS 13/14 Kapitel 2 Folie 2 XAML (1) s.a.
Entwicklung verteilter Anwendungen I, WS 13/14 Prof. Dr. Herrad Schmidt WS 13/14 Kapitel 1 Folie 2 Microsoft.NET Framework: Quelle:
Windows Presentation Foundation, Vorlesung Wintersemester 2013/14 Prof. Dr. Herrad Schmidt WS 13/14 Kapitel 9 Folie 2 ADO.NET (1) Klassen für Zugriffe.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Variablenkonzept Klassisch, in Java Basistyp
Vortrag: Visual Basic Neuerungen Autor : Dennis Hoyer
Objectives Verstehen was unterDelegate verstanden wird
Variablen in Programmiersprachen
SQLite und XML in PHP 5.
Einführung in PHP.
Einführung in PHP 5.
Learning By Doing Parallelverarbeitung Multithreading (Nebenläufigkeit) Alte Idee der Parallelverarbeitung statt rein sequentieller Prozesse Parallelverarbeitung.
Parallelisierung für Multiprozessor-Maschinen
Parallele Programmierung im.NET Framework Darmstadt, Präsentation am Beispiel von C-Sharp (C#)  Wichtige Grundlagen  Generika, Delegate, Lambda,
Mehrfachausführungen Schleifen in VB 2010 ee. Programmidee: Der Anwender gibt eine Zahl ein, und das Programm gibt die Mehrfachen dieser Zahl aus (das.
Microsoft Student Partner
Objektorientierte (OO) Programmierung
Programmierung unter VB.Net mit der IDE VisualStudio. Schritt für Schritt erklärt und beschrieben. Zielgruppe: Komplette Neueinsteiger mit fundiertem Computerwissen.
Implementieren von Klassen
 Präsentation transkript:

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 Buchautor Das 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 Jedermann Visual 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-Code Visual 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 2 3 1 LINQ Entity Framework Lambdas 5 6 4 Task Parallel Library Asynchrone Aufrufe WPF/Silverlight MVVM

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? Beispiel Dim Zahl = 1234 Dim GebDatum = "25.10.1963" Int32 DateTime oder String?

Automatische Properties (Version 10.0) Properties können vereinfacht definiert werden Es wird automatisch ein privates Feld angelegt Beispiel Property Email As String

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 Neues Schlüsselwort Dim Spieler = New List(Of Spieler) From { New Spieler With { .Name = "Spieler1"}, New Spieler With { .Name = "Spieler2"} } Beispiel Dim Zahlen = {11, 22, 33, 44} Dim Matrix = {{11,111}, {22,222}, {33,333}, {444,44}} Integer() 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 XElement-Objekt Eingebetteter Ausdruck 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")

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? = Nothing Dim b As Integer? = 123 Dim 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-Beispiel Module 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 beginnt bei 0 String-Klasse wird erweitert Erweiterungsmethode

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 Covarianz Module 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 Sub End Module Class Einfach End Class Class Spezial : Inherits Einfach End 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öhnlich Class Person Property Name As String Property Active As Boolean End Class Function auf der rechten Seite Dim CheckActiveUser As Func(Of Person, Boolean) = Function(p) p.Active Delegat-Typ Dim Personen As new List(Of Person) From {...} Dim AktivePersonen1 = Personen.Where(CheckActiveUser) Dim AktivePersonen2 = Personen.Where(CheckActiveUser).ToArray() WhereListIterator-Objekt Array

DoEvents-Ersatz für WPF In 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ösung Einfach 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ührt Iterator liefert im Rahmen einer For Each-Schleife bei Jedem Durchlauf das nächste Objekt Collection mit User-Objekten Damit beginnt Jede Abfrage Projektion, die den Rückgabetyp festgelegt (optional) Abfragevereinfachung Lokale Variable bezogen auf den Ausdruck

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 einfach Abrufen der Employees-Datensätze Using NwContext As New DBContext(My.Settings.NwCn) EmployeesCol = NwContext.Employees.ToList() End Using Wäre nicht erforderlich, da DBContext bereits die Datensätze als Collection zur 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

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) Klassen besitzen keine Abhängigkeiten Class Person Property Name As String End Person Class Mitarbeiter : Person <Key()> Property MitarbeiterID As Integer Property Reservierungen As Ienumerable(Of Reservierung) Property EinstellDatum As DateTime End Class Class Reservierung <Key()> Property ReservierungID As Integer Property MitarbeiterID As Integer End Class Class VBHotelContext : Inherits DBContext Property Mitarbeiter As DBSet(Of Mitarbeiter) Property Reservierungen As DBSet(Of Reservierung) End Class

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 Using End 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 Using End 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" modifiziert Unterstü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 Eine TaskAsync-Methode gibt ein Task(Of T)-Objekt zurück Dim T = Wc.DownloadStringTaskAsync("http://basta.net") Dim Content = Await T Task(Of String) Ohne den Umweg über eine Task(Of T)-Variable Dim Content = Await Wc.DownloadStringTaskAsync("http://basta.net") Befehl1 Befehl2 Nicht blockierend Werden über einen Callback erst nach Beendigung des Tasks ausgeführt

Beispiel mit .NET 4.0 Asynchroner 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 total End Function Lambda als Event-Handler Lambda als Event-Handler Einfacher Asynchroner Aufruf, aber was ist mit dem Kontrollfluss?

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 total End Function Compiler macht daraus einen Task, der als Callback ausgeführt wird Neu bei .NET 4.5 Async und Await sind neu bei VB11

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) Wird nach Beendigung des Tasks ausgeführt 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 zusammenfassen Vorher: 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 Genial: Methodenaufruf, der ein Task-Objekt liefert, aus der LINQ-Abfrage herausl 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 True End Function Hilfsklasse der Async CTP Künstliche Verzögerung Thread aus Threadpool

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 Next End 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-XML Beispiel: 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 Collection mit Meldung-Objekte Lambda-Iterator Xdocument-Objekt

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