Notizen zu meinen Büchern und anderen Themen RSS 2.0
 Tuesday, April 20, 2010

VFBLevZweiNull
(VB2010 Express wird mit Sicherheit ein Treffer;)

Die neue Version von Visual Basic 2010 Express, die es aktuell nur auf Englisch gibt (Ende April soll die deutschsprachige Version zur Verfügung stehen), macht einen hervorragenden Eindruck:

>Durch die Umstellung auf WPF wirkt die Schrift in der IDE deutlich konturenschärfer, was die Lesbarkeit erhöht

>Insgesamt wird die IDE aufgeräumter und einladender

>Der WPF-Editor wurde ein verbessert und bietet endlich Unterstützung für Datenbindung über das Property-Fenster, Intellisense für XAML-Attribute und die Möglichkeit, Brushes (also Farben und Muster) endlich komfortabel in einem Farbauswahlfenster einstellen zu können.

>Der Code-Editor von VS 2010 wurde generell verbessert - ein paar der Neuerungen gibt es auch in den Express Editionen, wie z.B. der Umstand, dass wenn ein Bezeichner (Variable) selektiert wird, alle Stellen, an denen der Bezeichner im Quelltext vorkommt, ebenfalls hervorgehoben werden (sehr praktisch) oder die "Suchfunktion" bei Intellisense, die z.B. bei Eingabe von "Dim r As Reader" dazu führt, dass in der Auswahlliste alle Klassen angeboten werden, in denen "Reader" enthalten ist (bei VS 2008 waren es nur Klassen, die mit Reader begannen, was oft nichts brachte, da man sich bekanntlich nie merken kann, ob eine Klasse XmlReader oder XmlTextReader heißt - zu mindestens geht es mir immer so;)).

Toll sind die "Multiline-Lambdas", durch die man z.B. schreiben kann:

Dim P =  Sub (Start, Ende)
             For n = Start To Ende
              Console.Writeline(n)
             Next
         End Sub

P(1,10)

Nicht, dass die Welt darauf gewartet hätte, eine Zählschleife so schreiben zu können, aber das kleine und harmlose Beispielchen zeigt trotzdem sehr schön, wie elegant sich Lambdas (anonyme Funktionen/Prozeduren) bei VB 10 schreiben lassen, die sich mit einem angehängten "AsParallel" theoretisch auch parallel ausführen lassen.

Das kann leicht übersehen werden: Die Spracherweiterungen von VB 10 stehen auch dann zur Verfügung, wenn das "Ziel" z.B. .NET 2.0 ausgewählt wird (per Voreinstellung wird das neue .NET 4 Client Profile als Ziel ausgewählt). Das bedeutet, dass man sie auch für Anwendungen verwenden kann, die noch unter .NET 2.0 laufen.

Covarianz und Contravarianz

Covarianz und Contravarianz sind zwei Begriffe, mit denen ich mich nach wie vor etwas schwer tue (Oliver Sturm kann das sicher wunderbar auf seine unnachahmliche Weise erklären und Eric Lippert, der bei Microsoft für die Implementierung in C# 4.0  zuständig war, erklärt die Begriffe in einem Blog auch sehr klar und strukturiert). Also, hier ein weiterer Versuch.

Die Begriffe Covarianz und Contravarianz beziehen sich auf den Umstand, wann für einen Typ T1 ein Typ T2 eingesetzt werden kann, der zu T1 in einer "ist abgeleitet von" oder "ist ein Basistyp von T1"-Beziehung steht. Wenn ich Eric Lippert richtig verstanden habe, dann ist nicht der Typ covariant/contravariant, sondern die Beziehung der Typen T1 und T2 untereinander ist es. Aus Gründen der sprachlichen Vereinfachung heißt es aber, dass ein Typ T in einer generischen Schnittstelle oder einem generischen Delegaten covariant/contravariant ist.

Covarianz liegt vor, wenn für einen Typ T1 in einer generischen Schnittstelle oder bei einem generischen Delegaten ein von T1 abgeleiteter Typ eingesetzt werden kann (also ein speziellerer Typ). Kontravarianz, wenn für T1 ein Typ eingesetzt werden kann, von dem sich T1 ableitet (also ein "allgemeinerer" Typ als T1). Beide haben etwas mit dem Thema Typsicherheit zu tun und sollen verhindern, dass zur Laufzeit InvalidCastExceptions auftreten, weil die Typen nicht zueinander passen.

Hier ein sehr einfaches Beispiel:

Dim Worte As IEnumerable(Of Object) = New List(Of String) From {"Sonntag", "Montag", "Dienstag"}

Unter .NET 3.5 führt die Zuweisung zu einer InvalidCastException, auch wenn sie "logisch" erscheint. Warum soll man einer Variablen vom Typ Object nicht einen String zuweisen können? Der folgende Befehl funktioniert doch auch:

Dim o As Object = "123"

Der Hintergrund ist, dass diese implizite Typenkonvertierung bei generischen Schnittstellen bislang nicht erlaubt war, da sie zu einer Typunsicherheit führen könnte. Wenn aber, wie es bei IEnumerable(Of T) der Fall ist, ohnehin nur Werte gelesen, aber keine hinzugefügt werden können, kann auch nichts schiefgehen, so dass die Regeln bei .NET 4.0 etwas gelockert wurden.

Covarianz und Contravarianz sind Eigenschaften der .NET-Klassenbibliothek und dort konkret bei generischen Schnittstellen und generischen Delegaten. Mit .NET 4.0 wurden Schnittstellen wie IEnumerable(Of T) so erweitert, dass für T auch ein von T abgeleiteter Typ (Covarianz) eingesetzt werden kann. Die dafür eingeführten Schlüsselwörter In und Out, mit denen die Parameter der Schnittstelle bzw. des Delegaten, die covariant (out) und kontravariant (in) sein sollen, sind neu bei VB 10 (und C# 4.0).

Hier am besten ein kleines Beispiel.

Gegeben seien zwei Klassen Person und Autor, wobei sich Autor von Person ableitet, damit eine "Grö0er-Kleiner"-Beziehung besteht. Weiterhin gibt es eine Variable vom Typ IEnumerable(Of Person), der eine generische List(Of Autor)-Collection zugewiesen werden soll. Unter .NET 3.5 (und damit VB 2008) gibt es bei der Ausführung eine InvalidCastException, da die Autor-Collection nicht einer Variablen vom Typ IEnumerable(Of Person) zugewiesen werden kann.

Unter VB 10 und .NET 4.0 ist die Zuweisung dagegen erlaubt, da der T-Parameter von IEnumerable(Of T) mit dem neuen Schlüsselwort Out erweitert wurde und damit covariant ist.

Hier ist das komplette Beispiel, das nebenbei auch von den neuen Collection-Initialisierern und automatischen Properties Gebrauch macht.

' ----------------------------------------------------------------------------
' Ein Beispiel für Covarianz bei Visual Basic 10 und .NET 4.0
' ----------------------------------------------------------------------------

Module Module1
    ' Generische Schnittstelle mit einem allgemeinen Typ
    Dim AutorenTeam As IEnumerable(Of Person)

    Sub Main()
        Console.Title = "Covarianz-Beispiel"
        Console.ForegroundColor = ConsoleColor.Green
        ' Zuweisung einer generischen Collection eines spezielleren Typs
        AutorenTeam = GetAutoren()

        Console.WriteLine("{0} Autoren im Team.", CType(AutorenTeam, List(Of Autor)).Count)
        Console.ReadLine()
    End Sub

    Function GetAutoren() As IEnumerable(Of Autor)
        Return New List(Of Autor) From {
            New Autor() With {.Name = "Albert", .GebDatum = "1.5.1955"},
            New Autor() With {.Name = "Bert", .GebDatum = "2.6.1972"}}
    End Function

End Module

Class Person
    Property Name As String
    Property GebDatum As DateTime
End Class

Class Autor : Inherits Person

End Class

 

Vorläufiges Fazit: Die mit .NET 4.0 für eine Reihe von Schnittstellen eingeführte Covarianz und Contravarianz sind eine praktische Angelegenheit, da sie zu etwas mehr Flexibilität beim Umgang mit generischen Schnittstellen (und generischen Delegaten) führen. Die meisten Visual Basic-Programmierer werden vermutlich gar nicht ahnen, dass bei einer Zuweisung Covarianz bzw. Contravarianz  im Spiel ist. Die neuen Schlüsselwörter In und Out spielen für die Praxis kaum eine Rolle und sind in erster Linie für Entwickler von Klassenbibliotheken interessant, die auf diese Weise den Einsatz ihrer Schnittstellen und Delegaten etwas flexibler gestalten können.

Ich hoffe, die Erklärungen war halbwegs verständlich (die MSDN-Doku erklärt die Themen auch recht ausführlich, wenngleich ich mich mit maschinell erstellten Übersetzungen wie "Kovarianz erlaubt einer Methode, einen stärker abgeleiteten Rückgabetyp zu verwenden, als vom generischen Typparameter der Schnittstelle definiert wurde" - was heißt hier "stärker abgeleitet?" - "etwas" schwer tue. Ich hoffe vor allem, dass die Erläuterungen sachlich korrekt sind. Ansonsten würde ich mich über einen Hinweis freuen.

Tuesday, April 20, 2010 2:29:30 PM (Romanische Sommerzeit, UTC+02:00)  #    Comments [0] -

Categories
Archive
<April 2010>
SunMonTueWedThuFriSat
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678
Blogroll
About the author/Disclaimer

Disclaimer
The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way.

© Copyright 2010
Peter Monadjemi
Sign In
Statistics
Total Posts: 84
This Year: 12
This Month: 0
This Week: 0
Comments: 0
Themes
Pick a theme:
All Content © 2010, Peter Monadjemi
DasBlog theme 'Business' created by Christoph De Baene (delarou)