Visual Basic .NET und Visual Basic 6 Ralf Westphal MSDN Regional Director, freier Fachautor & Berater [email protected].
Download ReportTranscript Visual Basic .NET und Visual Basic 6 Ralf Westphal MSDN Regional Director, freier Fachautor & Berater [email protected].
Visual Basic .NET und Visual Basic 6 Ralf Westphal MSDN Regional Director, freier Fachautor & Berater [email protected] Von VB6 zu VB.NET VB6 Allgm. Sprachen .NET CLR .NET Sprachen VB.NET 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 Von VB6 zu VB.NET VB6 Sprachen allgm. .NET CLR .NET Sprachen VB.NET Programmiersprachen allgemein Was gehört zu einer Sprache? • • • Syntax Semantik Programmierparadigma Was gehört nicht zu einer Sprache? • • • • • UI-Gestaltung Datenbankzugriff Typsystem Standardbibliothek APIs Von VB6 zu VB.NET VB6 Allgm. Sprachen .NET CLR .NET Sprachen VB.NET Warum eine Runtime? Einheitliches Integrationsmodell SprachIntegration Layer (VBRUNxx.DLL) (ATL.DLL) Kontext Concurrency Transaktionen Microsoft Transaction Server (MTXEX.DLL) Class-Loader Remoting COM Runtime (OLE32.DLL) Layer (VBRUNxx.DLL) (ATL.DLL) COM+ Runtime (OLE32.DLL) Common Language Runtime (MSCOREE.DLL) (MSCORLIB.DLL) .NET Framework VB C++ C# JScript … Common Language Specification User Interface Data and XML Base Class Library Common Language Runtime Visual Studio.NET Web Services Common Language Runtime Thread Support COM Marshaler Type Checker Exception Manager Security Engine Debug Engine IL to Native Compilers Code Manager Class Loader Garbage Collector Basics Microsoft 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 einem IL-Vorläufer im Einsatz Hello, World! C# VB.NET using System; Imports System namespace HelloWorld { public class Class1 { public static void Main() { Console.WriteLine("Hello, World!"); } } } Namespace HelloWorld Class Class1 Shared Sub Main() Console.WriteLine("Hello, World!") End Sub End Class End Namespace 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 } } } Basics Managed 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 Von VB6 zu VB.NET VB6 Allgm. Sprachen .NET CLR .NET Sprachen VB.NET Basics Common 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 System Das Objektmodell Object Value Type Boolean Int64 Byte SByte Enum Typen im Namespace System Char Single Type Currency TimeSpan DateTime String TypedRef. Decimal UInt16 Double Array UInt32 Guid UInt64 Exception Int16 Void Int32 Delegate Zwei Arten von Typen Variable enthält Speicher Initialisiert mit Zuweisung Value (struct) Reference (class) Wert Referenz Stack Heap Alles 0 Konstante: nothing kopiert Wert kopiert Referenz Dim i as integer = 123 Dim s as string _ = "Hello world" Dim j as integer = i Dim t as string = s i 123 "Hello world" s j t 123 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) i 123 o System.Int32 123 j 123 } “Boxing” } “Unboxing” Warum ein Framework? Einheitliches Programmiermodell .NET Framework VB Forms MFC & ATL Windows API ASP Base Class Library System.Web Services Description UI HtmlControls Discovery WebControls System.WinForms Design Protocols ComponentModel System.Drawing Caching Security Drawing2D Printing Configuration SessionState Imaging Text System.Data System.Xml ADO SQL XSLT Design SQLTypes XPath Serialization System Collections IO Security Runtime InteropServices Configuration Net ServiceProcess Diagnostics Reflection Text Remoting Globalization Resources Threading Serialization Gemeinsamer Nenner aller .NET Sprachen Codeerzeugung • Optimierung durch JITer Common Type System • • Garbage Collection COM-Interop, P/Invoke Sicherheitsinfrastruktur Attribute Ausnahmebehandlung Multithreading Standardbibliothek Basics Implikationen 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 Von VB6 zu VB.NET VB6 Allgm. Sprachen .NET CLR .NET Sprachen VB.NET VB.NET Die gute und die schlechte Nachricht Mit den .NET Sprachen hat das VBKonzept „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. Implementation Inheritance Public Class Mitarbeiter Public Function Gehalt() As Double ... End Function End Interface Public Class Arbeiter Inherits Mitarbeiter Public Property Zulage() As Double ... End Property End Interface 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 As String) Overloads Public Sub Display(ByVal theDouble As Double) Overloads Public Sub Display(byVal theInteger As Integer) Alternative zu optionalen Parametern. Polymorphy Public Class Mitarbeiter Overridable Public Function Gehalt() As Double Gehalt = Stunden * Stundenlohn End Function End Interface Public Class Arbeiter Inherits Mitarbeiter Overrides Function Gehalt() As Double Gehalt = Stunden * (Stundenlohn + Zulage) End Function End Interface 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 Interface Inheritance Interface erbt von Interface Public Interface Interface1 Public Sub M1() Public Property P1 As String End Interface Public Interface Interface2 Inherits Interface1 Public Sub M2() Public Property P2 As String End Interface Interface Inheritance Klasse implementiert und erbt Interface Public Interface Mitarbeiter Public Sub Gehalt() As Double End Interface Public Class Arbeiter Implements Mitarbeiter Public Sub Einkommen() As Double Implements Mitarbeiter.Gehalt .... End Sub Public Class Vorarbeiter End Class Inherits Arbeiter Erbt auch das Interface und die Implementation von Mitarbeiter End Class 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 von Daten und Code Werttyp Keine Vererbung Leichtgewichtiger Datencontainer 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 CallStack hochgereicht Delegates Delegate 1:1 Empfänger Multicast Delegate 1:n Empfänger Empfänger n:1 Delegate Empfänger Delegate Multicast Delegate Multicast Delegate n:m Empfänger 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 PropertyMethoden 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. Von VB6 zu VB.NET Conversion Wizard • • COM-Interop • • Funktioniert in Beta 2 noch unzureichend Probleme vor allem mit UI-bezogenem Code VB6 COM-Komponenten aus .NET Programmen nutzen .NET Komponenten in VB6-Programmen nutzen Nur komponentenbasierte Anwendungen werden einigermaßen schmerzfrei migriert werden können. Haben Sie sich auch so an VB6 gewöhnt? Dann ist es jetzt Zeit, auf .NET umzusteigen! Call to Action .NET lernen • Nehmen Sie sich Zeit, jede Woche ein wenig dazu zu lernen Evaluieren Sie gleichermaßen C# und VB.NET Probieren Sie den Conversion Wizard aus Stellen Sie sicher, dass Ihre Anwendungen komponentenbasiert sind Fragen!? Uff... Mehr Informationen http://www.microsoft.com/net http://msdn.microsoft.com/net http://www.microsoft.com/germany/msdn http://www.dotnetgerman.com/ http://www.dotnetjumpstart.net/ http://www.gotDotNet.com/ Dan Appleman: Moving to VB.NET: Strategies, Concepts, and Code; APress 2001 Ralf Westphal: Bist du es, Visual Basic? Teil 1 bis 4; Artikelserie in BasicPro 6/00 ff VB.NET Quellen 1/2 What's New in Visual Basic (TechEd Präsentation) http://www.gotdotnet.com/events/teched/slides/dev300_cdias.ppt Visual Basic .NET: New Programming Model and Language Enhancements Boost Development Power http://msdn.microsoft.com/msdnmag/issues/01/02/vbnet/vbnet.asp Visual Studio Enables the Programmable Web http://msdn.microsoft.com/vstudio/nextgen/technology/language.asp Visual Basic .NET Upgrade Roadmap http://msdn.microsoft.com/vbasic/technical/upgrade/roadmap.asp The Transition from Visual Basic 6.0 to Visual Basic .NET http://msdn.microsoft.com/vbasic/technical/upgrade/transition/default.a sp 10 More Ways to Prepare for VB.NET http://www.devx.com/upload/free/features/vbpj/2001/03mar01/bh_0103/b h_0103.asp Get Your Designs in Gear for VB.NET http://www.devx.com/upload/free/features/vbpj/2000/11nov00/pr0011/pr0 011.asp Drill Down on VB.NET http://www.devx.com/upload/free/features/vbpj/2001/01feb02/jf0102/jf010 2.asp VB.NET Quellen 2/2 An Introduction to Threading in VB.NET http://www.asptoday.com/content/articles/20010410.asp?WROXEMPTOKEN=9 34243ZaVjEiid0J0l7LCYvBGK Object Oriented Features in VB.NET http://www.asptoday.com/content/articles/20010518.asp?WROXEMPTOKEN=9 34243ZaVjEiid0J0l7LCYvBGK VB .NET Delegates http://www.asptoday.com/content/articles/20010619.asp?WROXEMPTOKEN=9 34243ZaVjEiid0J0l7LCYvBGK Polymorphism in VB.NET http://www.asptoday.com/content/articles/20010627.asp?WROXEMPTOKEN=9 34243ZaVjEiid0J0l7LCYvBGK Visual Basic .NET: Tracing, Logging, and Threading Made Easy with .NET http://msdn.microsoft.com/msdnmag/issues/01/07/vbnet/vbnet.asp New Features in Visual Basic .NET: Variables, Types, Arrays, and Properties http://msdn.microsoft.com/msdnmag/issues/01/05/Instincts/Instincts0105.asp Exploiting New Language Features in Visual Basic .NET, Part 2 http://msdn.microsoft.com/msdnmag/issues/01/08/Instincts/Instincts0108.asp Visual Basic .NET - 10 More RAD Years http://msdn.microsoft.com/msdnnews/2001/may/RAD/RAD.asp Die Qual der Wahl der Sprache http://www.microsoft.com/germany/ms/msdnbiblio/kolumne/300401RW.htm Empower people through great software any time, any place, and on any device