83
Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der „ersten“ Stunde) Bei Fragen rund um VB: [email protected]

Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: [email protected]

Embed Size (px)

Citation preview

Page 1: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

Moderne Visual Basic-Programmierung

Peter Monadjemi

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

Bei Fragen rund um VB: [email protected]

Page 2: 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

Page 3: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 4: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 5: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 6: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 7: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 8: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 9: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

1Lambdas

2LINQ

3Entity

Framework

4WPF/Silverlight

MVVM

6Asynchrone

Aufrufe

5Task

ParallelLibrary

Page 10: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

Grundlage für alles: Die Programmiersprache

Typinferenz

Automatische Properties

Collection- und Array-Initialisierer

Anonyme Typen

XML-Literale

Nullable Typen und Null-Weitergabe

Erweiterungsmethoden

usw.

Page 11: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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?

Page 12: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

Automatische Properties (Version 10.0)

Properties können vereinfacht definiert werden

Es wird automatisch ein privates Feld angelegt

Property Email As String

Beispiel

Page 13: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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(,)

Page 14: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 15: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 16: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 17: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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)

Page 18: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 19: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 20: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 21: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 22: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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)

Page 23: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

Mehr auf MSDN

Page 24: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 25: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 26: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 27: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 28: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 29: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 30: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 31: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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)

Page 32: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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)

Page 33: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 34: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 35: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 36: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 37: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 38: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 39: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

EF 4.1 – Die Struktur der Datenbank

Namensvergabe kannüberschrieben werden

Page 40: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 41: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 42: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 43: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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)

Page 44: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 45: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

Asynchrone Aufrufe (Schwerpunkt 5)

So war es bislang

So wird es mit Visual Basic 11 sein

Ebenfalls neu bei VB11: Iteratoren

Page 46: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 47: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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)

Page 48: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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)

Page 49: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 50: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 51: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 52: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 53: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 54: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 55: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 56: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 57: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

Beispiel: Asynchroner RSS-Reader

WPF-Anwendung

RSS-Feeds werden über DownloadStringAsyncTask heruntergeladen

Abbruch jederzeit möglich

Fortschrittsanzeige über IProgress-Schnittstelle

Page 58: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 59: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 60: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

Iteratoren

Was ist ein Iterator?

Ein Beispiel zur Einstimmung

Weitere Beispiele

Page 61: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 62: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 63: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 64: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 65: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

Iteratoren – Weitere Beispiele

Implementierung einer einfachen State-Machine

Durchlaufen eines Baums

Page 66: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

Entwickeln für Windows 8

Neu: Windows Runtime anstelle von .NET Runtime

Metro Style-Anwendungen als neuer Anwendungstyp

Die Rolle von Visual Basic

Page 67: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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)

Page 68: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

Das neue Anwendungsmodell

Page 69: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 70: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 71: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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)

Page 72: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 73: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 74: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 75: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 76: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 77: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 78: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 79: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 80: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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;};

Page 81: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 82: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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

Page 83: Moderne Visual Basic- Programmierung Peter Monadjemi (BASIC- und VB-Fan der ersten Stunde) Bei Fragen rund um VB: pm@activetraining.de

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