590 likes | 1.01k Views
Visual Basic .NET und Visual Basic 6. Ralf Westphal MSDN Regional Director, freier Fachautor & Berater ralfw@ralfw.de. Allgm. Sprachen. .NET CLR. .NET Sprachen. VB.NET. Von VB6 zu VB.NET. VB6. Was macht VB6 aus?. Einfache GUI-Gestaltung Einfacher DB-Umgang
E N D
Visual Basic .NETund Visual Basic 6 Ralf WestphalMSDN Regional Director, freier Fachautor & Berater ralfw@ralfw.de
Allgm. Sprachen .NET CLR .NET Sprachen VB.NET Von VB6 zu VB.NET VB6
Was macht VB6 aus? • Einfache GUI-Gestaltung • Einfacher DB-Umgang • Einfacher Umgang mit Strings • Einfache APIs • Intrinsische Funktionen, Declare, COM • Einfache Erzeugung von Komponenten • ActiveX-DLLs, UserControls • Einfache Syntax • „dot-Syntax“, keine Zeiger, Kontrollstrukturen • Einfache Semantik • Klassen, Objekt-Destruktor, Eval. Logischer Ausdrücke
VB6 allgemein • Syntax • Semantik • GUI RAD • Datenbankzugriff • Typsystem • OO-/Komponententechnologie • Standardbibliothek • APIs
Sprachen allgm. .NET CLR .NET Sprachen VB.NET Von VB6 zu VB.NET VB6
Programmiersprachen allgemein • Was gehört zu einer Sprache? • Syntax • Semantik • Programmierparadigma • Was gehört nicht zu einer Sprache? • UI-Gestaltung • Datenbankzugriff • Typsystem • Standardbibliothek • APIs
Allgm. Sprachen .NET CLR .NET Sprachen VB.NET Von VB6 zu VB.NET VB6
Sprach- Integration Kontext Concurrency Transaktionen Class-Loader Remoting Warum eine Runtime?Einheitliches Integrationsmodell Layer (VBRUNxx.DLL) (ATL.DLL) Layer (VBRUNxx.DLL) (ATL.DLL) Common Language Runtime (MSCOREE.DLL) (MSCORLIB.DLL) Microsoft Transaction Server (MTXEX.DLL) COM+ Runtime (OLE32.DLL) COM Runtime (OLE32.DLL)
.NET Framework VB C++ C# JScript … Visual Studio.NET Common Language Specification Web Services User Interface Data and XML Base Class Library Common Language Runtime
Thread Support COM Marshaler Type Checker Exception Manager Security Engine Debug Engine IL to Native Compilers Code Manager Garbage Collector Common Language Runtime Class Loader
BasicsMicrosoft Intermediate Language • Compiler erzeugen keinen native Code sondern eine prozessorunabhängige Zwischensprache • Sprachintegration erfolgt auf IL-Codeebene • MSIL – Microsoft Intermediate Language • IL-Code wird vor der Ausführung immer (!) durch Compiler in echten Maschinencode übersetzt • Unabhängigkeit von Hardwareplattformen • Unter Windows CE bereits mit einemIL-Vorläufer im Einsatz
C# using System; namespace HelloWorld { public class Class1 { public static void Main() { Console.WriteLine("Hello, World!"); } } } VB.NET Imports System Namespace HelloWorld Class Class1 Shared Sub Main() Console.WriteLine("Hello, World!") End Sub End Class End Namespace Hello, World! Alternativ: Module Module1 Sub Main() Console.WriteLine("Hello, World!") End Sub End Module
Hello, World: VB.NET IL .namespace Project3.HelloWorld { .class private auto ansi Class1 extends [mscorlib]System.Object { .method public specialname rtspecialname instance void .ctor() il managed { .custom instance void [mscorlib]System.Diagnostics.DebuggerStepThroughAttribute::.ctor() = ( 01 00 00 00 ) .maxstack 8 IL_0000: ldarg.0 IL_0001: call instance void [mscorlib]System.Object::.ctor() IL_0006: ret } .method public static void Main() il managed { .maxstack 1 .locals init ([0] class System.Object[] _Vb_t_record_0) IL_0000: nop IL_0001: ldstr "Hello, World!" IL_0006: call void [mscorlib]System.Console::WriteLine(class System.String) IL_000b: nop IL_000c: ret } } } .namespace Project3 { .class private auto ansi _vbProject extends [mscorlib]System.Object { .custom instance void [Microsoft.VisualBasic]Microsoft.VisualBasic.Globals/Globals$StandardModuleAttribute::.ctor() = ( 01 00 00 00 ) .method public static void _main(class System.String[] _s) il managed { .entrypoint .maxstack 8 IL_0000: call void Project3.HelloWorld.Class1::Main() IL_0005: ret } } }
Hello, World: C# IL .namespace HelloWorld { .class public auto ansi Class1 extends [mscorlib]System.Object { .method public hidebysig static void Main() il managed { .entrypoint .maxstack 8 IL_0000: ldstr "Hello, World!" IL_0005: call void [mscorlib]System.Console::WriteLine(class System.String) IL_000a: ret } .method public hidebysig specialname rtspecialname instance void .ctor() il managed { .maxstack 8 IL_0000: ldarg.0 IL_0001: call instance void [mscorlib]System.Object::.ctor() IL_0006: ret } } }
Hello, World: VB.NET IL (Alternativ) .namespace HelloWorld { .class private auto ansi Module1 extends [mscorlib]System.Object { .custom instance void [Microsoft.VisualBasic]Microsoft.VisualBasic.Globals/Globals$StandardModuleAttribute::.ctor() = ( 01 00 00 00 ) .method public static void Main() il managed { .maxstack 1 .locals init ([0] class System.Object[] _Vb_t_record_0) IL_0000: nop IL_0001: ldstr "Hello, World!" IL_0006: call void [mscorlib]System.Console::WriteLine(class System.String) IL_000b: nop IL_000c: ret } } .class private auto ansi _vbProject extends [mscorlib]System.Object { .custom instance void [Microsoft.VisualBasic]Microsoft.VisualBasic.Globals/Globals$StandardModuleAttribute::.ctor() = ( 01 00 00 00 ) .method public static void _main(class System.String[] _s) il managed { .entrypoint .maxstack 8 IL_0000: call void ConsoleApplication9.Module1::Main() IL_0005: ret } } }
BasicsManaged Code • Sämtlicher Code wird unter Aufsicht der Common Language Runtime ausgeführt • Runtime führt Sicherheitsüberprüfungen aus • Runtime übernimmt Speicherverwaltung und Fehlerbehandlung (Garbage Collection) • Runtime führt Versionsprüfungen aus • Dieser Code wird als Managed Code bezeichnet
Allgm. Sprachen .NET CLR .NET Sprachen VB.NET Von VB6 zu VB.NET VB6
BasicsCommon Type System • Das Typsystem wandert vom Compiler in die Runtime • Typen werden eindeutig • „ein String unter C# und ein String unter VB.NET sind identisch“ • Sprachen werden interoperabel, da sie das gleiche Typsystem benutzen • CTS – Common Type System
Common Type SystemDas Objektmodell Object Value Type Boolean Int64 Byte Enum SByte Char Single Type Currency TimeSpan Typen im Namespace System DateTime String TypedRef. Decimal UInt16 Double Array UInt32 Guid UInt64 Exception Int16 Void Int32 Delegate
Dim i as integer = 123 Dim s as string _ = "Hello world" 123 i "Hello world" s Dim j as integer = i Dim t as string = s 123 j t Zwei Arten von Typen
123 i } o System.Int32 “Boxing” 123 } “Unboxing” 123 j Boxing und Unboxing • Jeder Datentyp kann als Objekt gespeichert oder übergeben werden Dim i as integer = 123 Dim o as object = i Dim j as integer = Ctype(o, Integer)
.NET Framework Windows API ASP VB Forms MFC & ATL Warum ein Framework?Einheitliches Programmiermodell
Base Class Library System.Web System.WinForms Services UI Design ComponentModel Description HtmlControls Discovery WebControls Protocols System.Drawing Caching Security Drawing2D Printing Configuration SessionState Imaging Text System.Data System.Xml ADO SQL XSLT Serialization Design SQLTypes XPath System Collections IO Security Runtime InteropServices Configuration Net ServiceProcess Remoting Diagnostics Reflection Text Serialization Globalization Resources Threading
Gemeinsamer Nenner aller .NET Sprachen • Codeerzeugung • Optimierung durch JITer • Common Type System • Garbage Collection • COM-Interop, P/Invoke • Sicherheitsinfrastruktur • Attribute • Ausnahmebehandlung • Multithreading • Standardbibliothek
BasicsImplikationen • Sprachen werden gleichwertig, da alle Compiler MSIL-Code erzeugen • „eine C# Klasse kann von einer VB.NET Klasse abgeleitet sein“ • einheitliche Fehlerbehandlung • Compilerbau wird einfacher • kein eigenes Typsystem • Sprachen sind „per Definition“ interoperabel • keine Standardbibliothek • kein Codeoptimierungspass
Allgm. Sprachen .NET CLR .NET Sprachen VB.NET Von VB6 zu VB.NET VB6
VB.NET Die gute und die schlechte Nachricht • Mit den .NET Sprachen hat das VB-Konzept „gewonnen“ • dot-Syntax • Einfache Stringbehandlung • uvm. • Mit VB.NET verliert VB seine Alleinstellungsmerkmale
VB.NET • Was gehört zu VB.NET? • Syntax • Semantik • Programmierparadigma • Was gehört zum .NET Framework? • UI-Gestaltung • Datenbankzugriff • Typsystem • Standardbibliothek • APIs
Was ist neu durch VB.NET? • Tiefgreifende, „echte“ OO-Konzepte • Namespaces • Strukturierte Ausnahmebehandlung • Multithreading • uvm.
Public Class Arbeiter End Interface Inherits Mitarbeiter Public Property Zulage() As Double ... End Property Implementation Inheritance Public Class Mitarbeiter End Interface Public Function Gehalt() As Double ... End Function
Implementation Inheritance • Nur Einfachvererbung • Parametrierte Konstruktoren • Instanz- und Klassen-Member (shared) • Alle Methoden virtuell per default • Abstrakte und finale Klassen/Member
Overloading • Implementation einer Methode • mehrfach mit dem selben Namen, • aber immer eindeutiger Signatur Overloads Public Sub Display(ByVal theString AsString) Overloads Public Sub Display(ByVal theDouble AsDouble) Overloads Public Sub Display(byVal theInteger AsInteger) Alternative zu optionalen Parametern.
Public Class Mitarbeiter End Interface Overridable Public Function Gehalt() As Double Gehalt = Stunden * Stundenlohn End Function Public Class Arbeiter End Interface Inherits Mitarbeiter Overrides Function Gehalt() As Double Gehalt = Stunden * (Stundenlohn + Zulage) End Function Polymorphy
Polymorphy • Neudefinition der Implementation einer Basisklassenmethode in einer abgeleiteten Klasse • Muss in Basisklasse zugestanden werden (Overridable) • Signatur bleibt gleich • Verdeckt Basisklassenimplementation • Kann aber über MyBase aufgerufen werden
Public Interface Interface1 End Interface Public Sub M1() Public Property P1 As String Public Interface Interface2 End Interface Inherits Interface1 Public Sub M2() Public Property P2 As String Interface InheritanceInterface erbt von Interface
Public Interface Mitarbeiter End Interface Public Class Arbeiter End Class Public Sub Gehalt() As Double Implements Mitarbeiter Public Sub Einkommen() As Double Implements Mitarbeiter.Gehalt .... End Sub Interface InheritanceKlasse implementiert und erbt Interface Public Class Vorarbeiter End Class Inherits Arbeiter Erbt auch das Interface und die Implementation von Mitarbeiter
Interface Inheritance • „Echte“ Interfaces • Jede Klasse kann beliebig viele Interfaces implementieren • Vererbung von Interfaces • Ableitung neuer Interfaces • Abgeleitete Klassen erben auch Interfaces • Beliebige Zuordnung von Methoden der Klasse an Interface-Methoden
Strukturen • Zusammenschluss vonDaten und Code • Werttyp • Keine Vererbung • LeichtgewichtigerDatencontainer Structure Point Private _x, _y As Double Public Sub New(ByVal x As Double, ByVal y As Double) _x = x : _y = y End Sub Public Property x() As Double Get Return _x End Get Set(ByVal Value As Double) _x = Value End Set End Property Public Overrides Function ToString() As String Return "(" & _x & ", " & _y & ")" End Function End Structure
Ausnahmebehandlung Try auszuführende Anweisungen Catch e As COMException Fehlerbehandlung Catch e As Exception ... Catch When Err.Number = 5 ... Catch ... Finally Abschließende Behandlung, auch ohne Fehler End Try
Ausnahmebehandlung • Basiert auf Exception-Objekt/Klasse • Eigene Exception-Klassen möglich • Blockorientierte Fehlerbehandlung • Garantierte Nachbehandlung (finally) • Fehler während der Fehlerbehandlung (catch) müssen ebenfalls abgefangen werden • Nicht behandelte Fehler werden im Call-Stack hochgereicht
Delegates 1:1 Delegate Empfänger MulticastDelegate 1:n Empfänger Empfänger n:1 Delegate Empfänger Delegate MulticastDelegate n:m Empfänger MulticastDelegate Empfänger
Delegates Delegate Sub MySubDelegate(ByVal x As Integer) Class MyClass Sub MySub(ByVal x As Integer) MessageBox.Show("Der Wert von X ist:" & CStr(x)) End Sub End Class Sub Test Dim mc As New MyClass Dim msd As New MySubDelegate(AddressOf mc.MySub) msd.Invoke(10) msd(10) End Sub
Delegates Dim TB1 As TextBox Dim TB2 As TextBox Protected Sub MyHandler(ByVal Sender As Object, ByVal e As System.EventArgs) Dim TB As TextBox TB = CType(sender, TextBox) End Class AddHandler TB1.TextChanged, New System.EventHandler(AddressOf MyHandler) AddHandler TB2.TextChanged, New System.EventHandler(AddressOf MyHandler)
Delegates • Typisierte Funktionszeiger • Sind selbst Typen und damit Objekte • Basis für Ereignisbehandlung • „Reale“ Funktion muss gleiche Signatur haben • WithEvents gibt es weiterhin
Attribute <AttributeUsage(AttributeTargets.All)> Public Class AutorAttribute Inherits Attribute Public name As String Public project As String Public Sub New(ByVal name As String) Me.name = name End Sub End Class <Autor("Westphal", project:="Roadshow")> Structure Point ... End Structure
Attribute • Runtime/Design-Time Informationen für Typen und deren Elemente • Vollständig erweiterbar • Ein Attribut ist eine Klasse, die von System.Attribute abgeleitet wurde • Attribute werden erst instanziert, wenn darauf zugegriffen wird • Code ist „self contained“ • Keine neuen Schlüsselwörter oder pragma • Keine zusätzlichen Dateien, z.B.: .IDL, .DEF • Zugriff zur Laufzeit über Reflection API • Beispiele • Wird im Framework an vielen Stellen benutzt: XML, Web Services, Security, Serialization, Component Model, COM und P/Invoke Interop … • URL für Dokumentation einer Klasse • „Transaction context“ einer Methode • Wie wird in XML persistiert
Multithreading Class Foo Sub Baz() Console.WriteLine("Foo Baz is running on another thread") End Sub End Class Sub main() Dim oFoo As Foo oFoo = New Foo() Dim otter As ThreadStart otter = New ThreadStart(AddressOf oFoo.Baz) Dim oThread As Thread oThread = New Thread(otter) oThread.Start End Sub
Multithreading • Thread-Funktionen • Instanz- oder Klassen-Methode • Werden per ThreadStart-Delegate übergeben • Keine Parameter • Kein Funktionsresultat • Cross-Thread-Aufrufe sind transparent • Thread-Kontrolle über Instanz oder Klasse • z.B. myThread.Stop
Was ändert sich mit VB.NET? 1/2 • Syntax • Andere Property-Syntax • Structure statt Type • Volle Qualifizierung von Enum-Konstanten • Typzuweisung mit mehreren Vars bei Dim • Klammern bei Sub/Function-Aufrufen • Semantik • Gültigkeitsbereich von Blockvariablen • Indeterministische Finalisation • Keine statischen Sub/Function mehr • ByVal ist default • Gleichstellung von Member-Variablen und Property-Methoden • Default-Methoden müssen Eigenschaften mit einem Param. sein • Variant entfällt
Was ändert sich mit VB.NET? 2/2 • Anweisungen/Funktionen • Kein Gosub, On/Gosub, On/Goto mehr • Open/Close etc. jetzt Funktionen • Kein IsMissing mehr • Umgebung • Keine Tag-Eigenschaft mehr bei Steuerelementen • Keine Steuerelementfelder mehr • Keine fensterlosen Steuerelemente mehr • uvm.