2. Grundlagen der Sprache VB.NET
2.1. Einführung
Zunächst betrachten wir VB.NET als eine traditionelle Programmiersprache. Auf Objekte gehen wir später ein.
In einem Programm gibt es zwei Dinge
- Daten
- die Anweisungen, die sie bearbeiten
Im Allgemeinen versuchen wir, Daten von Anweisungen zu trennen:
![]() |
2.2. VB.NET-Daten
VB.NET verwendet die folgenden Datentypen:
- Ganzzahlen, reelle Zahlen und Dezimalzahlen
- Zeichen und Zeichenfolgen
- Boolesche Werte
- Datumsangaben
- Objekte
2.2.1. Vordefinierte Datentypen
VB-Typ | Entsprechender .NET-Typ | Größe | Wertebereich |
Boolean | System.Boolean | 2 Byte | True oder False. |
Byte | System.Byte | 1 Byte | 0 bis 255 (vorzeichenlos). |
Char | System.Char | 2 Bytes | 0 bis 65.535 (vorzeichenlos). |
Date | System.DateTime | 8 Byte | 0:00:00 am 1. Januar 0001 bis 23:59:59 am 31. Dezember 9999. |
Dezimal | System.Decimal | 16 Bytes | 0 bis +/-79.228.162.514.264.337.593.543.950.335 ohne Dezimalstellen; 0 bis +/-7,9228162514264337593543950335 mit 28 Dezimalstellen; wobei die kleinste Zahl ungleich Null +/-0,0000000000000000000000000001 (+/-1E-28) ist. |
Double | System.Double | 8 Byte | -1,79769313486231E+308 bis -4,94065645841247E-324 für negative Werte; 4,94065645841247E-324 bis 1,79769313486231E+308 für positive Werte. |
Integer | System.Int32 | 4 Byte | -2.147.483.648 bis 2.147.483.647. |
Long | System.Int64 | 8 Byte | -9.223.372.036.854.775.808 bis 9.223.372.036.854.775.807. |
Objekt | System.Object | 4 Byte | In einer Variablen vom Typ „Object“ kann jeder beliebige Typ gespeichert werden. |
Short | System.Int16 | 2 Bytes | -32.768 bis 32.767. |
Single | System.Single | 4 Byte | -3,402823E+38 bis -1,401298E-45 für negative Werte; 1,401298E-45 bis 3,402823E+38 für positive Werte. |
String | System.String (Klasse) | 0 bis ca. 2 Milliarden Unicode-Zeichen. |
In der obigen Tabelle sehen wir, dass es zwei mögliche Typen für eine 32-Bit-Ganzzahl gibt: Integer und System.Int32. Die beiden Typen sind austauschbar. Dasselbe gilt für andere VB-Typen und ihre Entsprechungen in der .NET-Plattform. Hier ist ein Beispielprogramm:
Module types
Sub Main()
' whole numbers
Dim var1 As Integer = 100
Dim var2 As Long = 10000000000L
Dim var3 As Byte = 100
Dim var4 As Short = 4
' real numbers
Dim var5 As Decimal = 4.56789D
Dim var6 As Double = 3.4
Dim var7 As Single = -0.000103F
' date
Dim var8 As Date = New Date(2003, 1, 1, 12, 8, 4)
' boolean
Dim var9 As Boolean = True
' character
Dim var10 As Char = "A"c
' character string
Dim var11 As String = "abcde"
' object
Dim var12 As Object = New Object
' displays
Console.Out.WriteLine("var1=" + var1.ToString)
Console.Out.WriteLine("var2=" + var2.ToString)
Console.Out.WriteLine("var3=" + var3.ToString)
Console.Out.WriteLine("var4=" + var4.ToString)
Console.Out.WriteLine("var5=" + var5.ToString)
Console.Out.WriteLine("var6=" + var6.ToString)
Console.Out.WriteLine("var7=" + var7.ToString)
Console.Out.WriteLine("var8=" + var8.ToString)
Console.Out.WriteLine("var9=" + var9.ToString)
Console.Out.WriteLine("var10=" + var10)
Console.Out.WriteLine("var11=" + var11)
Console.Out.WriteLine("var12=" + var12.ToString)
End Sub
End Module
Die Ausführung liefert folgende Ergebnisse:
var1=100
var2=10000000000
var3=100
var4=4
var5=4,56789
var6=3,4
var7=-0,000103
var8=01/01/2003 12:08:04
var9=True
var10=A
var11=abcde
var12=System.Object
2.2.2. Literal-Notation
145, -7, &FF (hexadezimal) | |
100000L | |
134,789, -45E-18 (-45 × 10⁻¹⁸) | |
134,789F, -45E-18F (-45 × 10⁻¹⁸) | |
100000D | |
"A"c | |
"today" | |
wahr, falsch | |
New Date(2003, 1, 1) für den 01.01.2003 |
Beachten Sie folgende Punkte:
- 100000L, wobei L angibt, dass die Zahl als Long-Integer behandelt wird
- 134,789F, wobei F angibt, dass die Zahl als Gleitkommazahl mit einfacher Genauigkeit behandelt wird
- 100000D, wobei D angibt, dass die Zahl als dezimale reelle Zahl behandelt wird
- "A"c, um die Zeichenkette "A" in das Zeichen 'A' zu konvertieren
- Die Zeichenkette wird in das Zeichen „.“ eingeschlossen. Wenn die Zeichenkette das Zeichen „“ enthalten muss, wird es verdoppelt, wie in „abcd“„e“, um die Zeichenkette [abcd“e] darzustellen.
2.2.3. Datendeklaration
2.2.3.1. Rolle von Deklarationen
Ein Programm verarbeitet Daten, die durch einen Namen und einen Typ gekennzeichnet sind. Diese Daten werden im Speicher abgelegt. Bei der Kompilierung des Programms weist der Compiler jedem Datenelement einen Speicherplatz zu, der durch eine Adresse und eine Größe gekennzeichnet ist. Dies geschieht anhand der vom Programmierer vorgenommenen Deklarationen. Darüber hinaus ermöglichen diese Deklarationen dem Compiler, Programmierfehler zu erkennen. So wird beispielsweise die Operation x = x \* 2 als Fehler deklariert, wenn x eine Zeichenkette ist.
2.2.3.2. Deklaration von Konstanten
Die Syntax für die Deklaration einer Konstante lautet wie folgt:
const Bezeichner as Typ=Wert
Beispiel: [const PI as double=3.141592]. Warum Konstanten deklarieren?
- Das Programm ist leichter zu lesen, wenn die Konstante einen aussagekräftigen Namen erhält: [const VAT_rate as single=0.186F]
- Das Programm lässt sich leichter ändern, wenn die „Konstante“ angepasst werden muss. Wenn sich im vorigen Fall der Mehrwertsteuersatz auf 33 % ändert, muss lediglich die Anweisung geändert werden, die den Wert definiert: [const vatrate as single=0.336F]. Wäre 0.186 explizit im Programm verwendet worden, müssten zahlreiche Anweisungen geändert werden.
2.2.3.3. Variablendeklaration
Eine Variable wird durch einen Namen identifiziert und bezieht sich auf einen Datentyp. VB.NET unterscheidet nicht zwischen Groß- und Kleinbuchstaben. Daher sind die Variablen FIN und fin identisch. Variablen können bei ihrer Deklaration initialisiert werden. Die Syntax zum Deklarieren einer oder mehrerer Variablen lautet:
dim variable1,variable2,...,variablen as type_identifier
wobei typ_bezeichner ein vordefinierter Typ oder ein vom Programmierer definierter Typ ist.
2.2.4. Konvertierungen zwischen Zahlen und Zeichenfolgen
number.ToString oder "" & number oder CType(number, String) | |
Objekt.ToString | |
Integer.Parse(Zeichenkette) oder Int32.Parse | |
Long.Parse(Zeichenkette) oder Int64.Parse | |
Double.Parse(string) | |
Single.Parse(string) |
Die Umwandlung einer Zeichenfolge in eine Zahl kann fehlschlagen, wenn die Zeichenfolge keine gültige Zahl darstellt. Dies führt zu einem schwerwiegenden Fehler, der in VB.NET als Ausnahme bezeichnet wird. Dieser Fehler kann mithilfe des folgenden try/catch-Blocks abgefangen werden:
try
appel de la fonction susceptible de générer l'exception
catch e as Exception
traiter l'exception e
end try
instruction suivante
Wenn die Funktion keine Ausnahme auslöst, fahren wir mit der nächsten Anweisung fort; andernfalls springen wir in den Körper der catch-Klausel und fahren dann mit der nächsten Anweisung fort. Wir werden später auf die Ausnahmebehandlung zurückkommen. Hier ist ein Programm, das die wichtigsten Techniken zur Konvertierung zwischen Zahlen und Zeichenketten demonstriert. In diesem Beispiel gibt die Funktion display den Wert ihres Parameters auf dem Bildschirm aus. Somit gibt display(S) den Wert von S auf dem Bildschirm aus.
' guidelines
Option Strict On
' imported namespaces
Imports System
' the test module
Module Module1
Sub Main()
' main proceedings
' local data
Dim S As String
Const i As Integer = 10
Const l As Long = 100000
Const f As Single = 45.78F
Dim d As Double = -14.98
' number --> string
affiche(CType(i, String))
affiche(CType(l, String))
affiche(CType(f, String))
affiche(CType(d, String))
'boolean --> string
Const b As Boolean = False
affiche(b.ToString)
' string --> int
Dim i1 As Integer = Integer.Parse("10")
affiche(i1.ToString)
Try
i1 = Integer.Parse("10.67")
affiche(i1.ToString)
Catch e As Exception
affiche("Erreur [10.67] : " + e.Message)
End Try
' chain --> long
Dim l1 As Long = Long.Parse("100")
affiche("" + l1.ToString)
Try
l1 = Long.Parse("10.675")
affiche("" & l1)
Catch e As Exception
affiche("Erreur [10.675] : " + e.Message)
End Try
' chain --> double
Dim d1 As Double = Double.Parse("100,87")
affiche(d1.ToString)
Try
d1 = Double.Parse("abcd")
affiche("" & d1)
Catch e As Exception
affiche("Erreur [abcd] : " + e.Message)
End Try
' chain --> single
Dim f1 As Single = Single.Parse("100,87")
affiche(f1.ToString)
Try
d1 = Single.Parse("abcd")
affiche(f1.ToString)
Catch e As Exception
affiche("Erreur [abcd] : " + e.Message)
End Try
End Sub
' poster
Public Sub affiche(ByVal S As String)
Console.Out.WriteLine("S=" + S)
End Sub
End Module
Die Ergebnisse lauten wie folgt:
S=10
S=100000
S=45,78
S=-14,98
S=False
S=10
S=Erreur [10.67] : Le format de la chaîne d'entrée est incorrect.
S=100
S=Erreur [10.675] : Le format de la chaîne d'entrée est incorrect.
S=100,87
S=Erreur [abcd] : Le format de la chaîne d'entrée est incorrect.
S=100,87
S=Erreur [abcd] : Le format de la chaîne d'entrée est incorrect.
Beachten Sie, dass reelle Zahlen in Zeichenfolgenform ein Komma und keinen Dezimalpunkt verwenden müssen. Daher schreiben wir Dim d As Double = -14.98, aber Dim d1 As Double = Double.Parse("100.87")
2.2.5. Daten-Arrays
Ein VB.NET-Array ist ein Objekt, mit dem Daten desselben Typs unter einem einzigen Bezeichner zusammengefasst werden können. Es wird wie folgt deklariert:
Dim Array(n) As Type oder Dim Array() As Type = New Type(n) {}
wobei n der Index des letzten Array-Elements ist. Die Syntax Array(i) bezieht sich auf die Daten am Index i, wobei i zum Bereich [0,n] gehört. Jeder Verweis auf die Daten Array(i), bei dem i nicht zum Bereich [0,n] gehört, löst eine Ausnahme aus. Ein Array kann gleichzeitig mit seiner Deklaration initialisiert werden. In diesem Fall muss der Index des letzten Elements nicht angegeben werden.
Dim entiers() As Integer = {0, 10, 20, 30}
Arrays verfügen über eine Length-Eigenschaft, die die Anzahl der Elemente im Array angibt. Hier ist ein Beispielprogramm:
Module tab0
Sub Main()
' a first picture
Dim tab0(5) As Integer
For i As Integer = 0 To UBound(tab0)
tab0(i) = i
Next
For i As Integer = 0 To UBound(tab0)
Console.Out.WriteLine("tab0(" + i.ToString + ")=" + tab0(i).tostring)
Next
' a second panel
Dim tab1() As Integer = New Integer(5) {}
For i As Integer = 0 To tab1.Length - 1
tab1(i) = i * 10
Next
For i As Integer = 0 To tab1.Length - 1
Console.Out.WriteLine("tab1(" + i.ToString + ")=" + tab1(i).tostring)
Next
End Sub
End Module
und dessen Ausführung:
tab0(0)=0
tab0(1)=1
tab0(2)=2
tab0(3)=3
tab0(4)=4
tab0(5)=5
tab1(0)=0
tab1(1)=10
tab1(2)=20
tab1(3)=30
tab1(4)=40
tab1(5)=50
Ein zweidimensionales Array kann wie folgt deklariert werden:
Dim Array(n, m) As Typ oder Dim Array(,) As Typ = New Typ(n, m) {}
wobei n+1 die Anzahl der Zeilen und m+1 die Anzahl der Spalten ist. Die Syntax Array(i,j) bezieht sich auf das Element j in Zeile i von Array. Das zweidimensionale Array kann auch gleichzeitig mit seiner Deklaration initialisiert werden:
Dim réels(,) As Double = {{0.5, 1.7}, {8.4, -6}}
Die Anzahl der Elemente in jeder Dimension kann mit der Methode GetLength(i) ermittelt werden, wobei i=0 die dem ersten Index entsprechende Dimension, i=1 die dem zweiten Index entsprechende Dimension usw. darstellt. Hier ist ein Beispielprogramm:
Module Module2
Sub Main()
' a first picture
Dim tab0(2, 1) As Integer
For i As Integer = 0 To UBound(tab0)
For j As Integer = 0 To tab0.GetLength(1) - 1
tab0(i, j) = i * 10 + j
Next
Next
For i As Integer = 0 To UBound(tab0)
For j As Integer = 0 To tab0.GetLength(1) - 1
Console.Out.WriteLine("tab0(" + i.ToString + "," + j.ToString + ")=" + tab0(i, j).tostring)
Next
Next
' a second panel
Dim tab1(,) As Integer = New Integer(2, 1) {}
For i As Integer = 0 To tab1.GetLength(0) - 1
For j As Integer = 0 To tab1.GetLength(1) - 1
tab1(i, j) = i * 100 + j
Next
Next
For i As Integer = 0 To tab1.GetLength(0) - 1
For j As Integer = 0 To tab1.GetLength(1) - 1
Console.Out.WriteLine("tab1(" + i.ToString + "," + j.ToString + ")=" + tab1(i, j).tostring)
Next
Next
End Sub
End Module
und die Ergebnisse der Ausführung:
tab0(0)=0
tab0(1)=1
tab0(2)=2
tab0(3)=3
tab0(4)=4
tab0(5)=5
tab1(0)=0
tab1(1)=10
tab1(2)=20
tab1(3)=30
tab1(4)=40
tab1(5)=50
Ein Array von Arrays wird wie folgt deklariert:
Dim Array(n)() As Type oder Dim Array()() As Type = New Type(n)()
Die obige Deklaration erstellt ein Array mit n+1 Zeilen. Jedes Element Array(i) ist eine Referenz auf ein eindimensionales Array. Diese Arrays werden bei der obigen Deklaration nicht erstellt. Das folgende Beispiel veranschaulicht die Erstellung eines Arrays von Arrays:
' a table of tables
Dim noms()() As String = New String(3)() {}
' initialization
For i = 0 To noms.Length - 1
noms(i) = New String(i) {}
For j = 0 To noms(i).Length - 1
noms(i)(j) = "nom" & i & j
Next
Next
Hier ist names(i) ein Array mit i+1 Elementen. Da names(i) ein Array ist, gibt names(i).Length die Anzahl der darin enthaltenen Elemente an. Hier ist ein Beispiel, das die drei gerade besprochenen Array-Typen kombiniert:
' guidelines
Option Strict On
Option Explicit On
' imports
Imports System
' test class
Module test
Sub main()
' an initialized 1-dimensional array
Dim entiers() As Integer = {0, 10, 20, 30}
Dim i As Integer
For i = 0 To entiers.Length - 1
Console.Out.WriteLine("entiers[" & i & "]=" & entiers(i))
Next
' an initialized 2-dimensional array
Dim réels(,) As Double = {{0.5, 1.7}, {8.4, -6}}
Dim j As Integer
For i = 0 To réels.GetLength(0) - 1
For j = 0 To réels.GetLength(1) - 1
Console.Out.WriteLine("réels[" & i & "," & j & "]=" & réels(i, j))
Next
Next
' an array°of arrays
Dim noms()() As String = New String(3)() {}
' initialization
For i = 0 To noms.Length°- 1
noms(i) =°New String(i) {}
For j = 0 To noms(i).Length - 1
noms(i)(j) = "nom" & i & j
Next
Next
' display
For i = 0 To noms.Length°- 1
For j = 0 To noms(i).Length - 1
Console.Out.WriteLine("noms[" & i & "][" & j & "]=" & noms(i)(j))
Next
Next
End Sub
End Module
Bei der Ausführung erhalten wir folgende Ergebnisse:
entiers[0]=0
entiers[1]=10
entiers[2]=20
entiers[3]=30
réels[0,0]=0,5
réels[0,1]=1,7
réels[1,0]=8,4
réels[1,1]=-6
noms[0][0]=nom00
noms[1][0]=nom10
noms[1][1]=nom11
noms[2][0]=nom20
noms[2][1]=nom21
noms[2][2]=nom22
noms[3][0]=nom30
noms[3][1]=nom31
noms[3][2]=nom32
noms[3][3]=nom33
2.3. Grundlegende VB.NET-Anweisungen
Wir unterscheiden zwischen
1 die grundlegenden Anweisungen, die vom Computer ausgeführt werden.
2 Anweisungen, die den Programmablauf steuern.
Grundlegende Befehle werden verständlich, wenn man die Struktur eines Mikrocomputers und seiner Peripheriegeräte betrachtet.
![]() |
-
Einlesen von Informationen über die Tastatur
-
Informationsverarbeitung
-
Schreiben von Informationen auf den Bildschirm
-
Lesen von Informationen aus einer Datei
-
Schreiben von Informationen in eine Datei
2.3.1. Schreiben auf den Bildschirm
Es gibt verschiedene Befehle zum Schreiben auf den Bildschirm:
Console.Out.WriteLine(expression)
Console.WriteLine(expression)
Console.Error.WriteLine (expression)
wobei Ausdruck ein beliebiger Datentyp ist, der in eine Zeichenfolge konvertiert werden kann, um auf dem Bildschirm angezeigt zu werden. In den bisher gezeigten Beispielen haben wir nur die Anweisung Console.Out.WriteLine(Ausdruck) verwendet.
Die Klasse „System.Console“ bietet Zugriff auf Funktionen zum Schreiben auf den Bildschirm (Write, WriteLine). Die Klasse „Console“ verfügt über zwei Eigenschaften, „Out“ und „Error“, bei denen es sich um Schreibströme vom Typ „StreamWriter“ handelt:
- Console.WriteLine() entspricht Console.Out.WriteLine() und schreibt in den Out-Stream, der normalerweise mit dem Bildschirm verknüpft ist.
- Console.Error.WriteLine() schreibt in den Error-Stream, der ebenfalls in der Regel mit dem Bildschirm verknüpft ist.
Die Streams „Out“ und „Error“ sind standardmäßig mit dem Bildschirm verknüpft. Sie können jedoch zur Laufzeit in Textdateien umgeleitet werden, wie wir gleich sehen werden.
2.3.2. Lesen von über die Tastatur eingegebenen Daten
Der Datenstrom von der Tastatur wird durch das Console.In-Objekt vom Typ StreamReader dargestellt. Mit diesem Objekttyp können Sie mithilfe der ReadLine-Methode eine Textzeile lesen:
Dim ligne As String = Console.In.ReadLine()
Die über die Tastatur eingegebene Zeile wird in der Variablen line* gespeichert und kann dann vom Programm verwendet werden. Der In-Stream kann genau wie die Out- und Error*-Streams in eine Datei umgeleitet werden.
2.3.3. Beispiel für Ein- und Ausgabe
Hier ist ein kurzes Programm, das Eingabe- und Ausgabeoperationen über Tastatur und Bildschirm veranschaulicht:
' options
Option Explicit On
Option Strict On
' namespaces
Imports System
' module
Module io1
Sub Main()
' write to Out feed
Dim obj As New Object
Console.Out.WriteLine(("" & obj.ToString))
' write to the Error stream
Dim i As Integer = 10
Console.Error.WriteLine(("i=" & i))
' reading a line entered on the keyboard
Console.Out.Write("Tapez une ligne : ")
Dim ligne As String = Console.In.ReadLine()
Console.Out.WriteLine(("ligne=" + ligne))
End Sub
End Module
und die Ergebnisse der Ausführung:
Die Anleitung
Dim obj As New Object
Console.Out.WriteLine(obj.ToString)
dienen lediglich dazu, zu zeigen, dass jedes Objekt angezeigt werden kann. Wir werden hier nicht versuchen, die Bedeutung des Angezeigten zu erklären.
2.3.4. E/A-Umleitung
Unter DOS/Windows gibt es drei Standard-Eingabegeräte mit den Namen:
- Standard-Eingabegerät – bezieht sich standardmäßig auf die Tastatur und hat die Nummer 0
- Standardausgabegerät – standardmäßig der Bildschirm und mit der Nummer 1
- Standard-Ausgabegerät – bezieht sich standardmäßig auf den Bildschirm und hat die Nummer 2
In VB.NET schreibt der Ausgabestrom Console.Out auf Gerät 1, der Ausgabestrom Console.Error schreibt auf Gerät 2 und der Eingabestrom Console.In liest Daten von Gerät 0. Wenn Sie ein Programm in einem DOS-Fenster unter Windows ausführen, können Sie festlegen, welche Geräte für das laufende Programm die Nummern 0, 1 und 2 erhalten sollen. Betrachten Sie die folgende Befehlszeile:
Nach den Argumenten argi des pg-Programms können Sie die Standard-E/A-Geräte in Dateien umleiten:
Der Standardeingabestrom Nr. 0 wird in die Datei in.txt umgeleitet. Im Programm liest der Console.In-Strom daher seine Daten aus der Datei in.txt. | ||||
leitet den Ausgabestrom Nr. 1 in die Datei „out.txt“ um. Das bedeutet, dass der „Console.Out“-Strom im Programm seine Daten in die Datei „out.txt“ schreibt | ||||
Wie oben, jedoch werden die geschriebenen Daten an den aktuellen Inhalt der Datei „out.txt“ angehängt. | ||||
leitet die Ausgabe Nr. 2 in die Datei „error.txt“ um. Das bedeutet, dass im Programm der Stream „Console.Error“ seine Daten in die Datei „error.txt“ schreibt | ||||
Wie oben, jedoch werden die geschriebenen Daten an den aktuellen Inhalt der Datei „error.txt“ angehängt. | ||||
Die Geräte 1 und 2 werden beide in Dateien umgeleitet | ||||
Beachten Sie, dass das pg-Programm nicht geändert werden muss, um seine Ein- und Ausgabeströme in Dateien umzuleiten. Es ist das Betriebssystem, das die Art der Geräte 0, 1 und 2 festlegt. Betrachten Sie das folgende Programm:
' options
Option Explicit On
Option Strict On
' namespaces
Imports System
' redirections
Module console2
Sub Main()
' lecture flux In
Dim data As String = Console.In.ReadLine()
' write Out feed
Console.Out.WriteLine(("écriture dans flux Out : " + data))
' écriture flux Error
Console.Error.WriteLine(("écriture dans flux Error : " + data))
End Sub
End Module
Kompilieren wir dieses Programm:
dos>vbc es2.vb
Compilateur Microsoft (R) Visual Basic .NET version 7.10.3052.4 pour Microsoft (R) .NET Framework version 1.1.4322.573
Copyright (C) Microsoft Corporation 1987-2002. Tous droits réservés.
dos>dir
24/02/2004 15:39 416 es2.vb
11/03/2004 08:20 3 584 es2.exe
Führen wir es zum ersten Mal aus:
dos>es2.exe
un premier test
écriture dans flux Out : un premier test
écriture dans flux Error : un premier test
Die vorherige Ausführung leitet keinen der Standard-E/A-Streams In, Out oder Error um. Wir werden nun alle drei Streams umleiten. Der In-Stream wird in eine Datei namens in.txt umgeleitet, der Out-Stream in eine Datei namens out.txt und der Error-Stream in eine Datei namens error.txt. Diese Umleitung wird in der Befehlszeile wie folgt durchgeführt
Die Ausführung liefert die folgenden Ergebnisse:
dos>more in.txt
un second test
dos>es2.exe 0<in.txt 1>out.txt 2>error.txt
dos>more out.txt
écriture dans flux Out : un second test
dos>more error.txt
écriture dans flux Error : un second test
Es ist klar, dass die Out- und Error-Streams nicht auf dieselben Geräte schreiben.
2.3.5. Zuweisung des Werts eines Ausdrucks an eine Variable
Hier interessiert uns die Operation variable=ausdruck. Der Ausdruck kann folgende Typen haben: arithmetisch, relational, boolesch oder Zeichenkette.
2.3.5.1. Liste der Operatoren
Aktion | Sprachelement |
^, –, *, /, \, Mod, +, = | |
=, ^=, *=, /=, \=, +=, -=, &= | |
=, <>, <, >, <=, >=, Like, Is | |
&, + | |
Nicht, Und, Oder, XOR, UndAuch, OderSonst | |
AddressOf, GetType |
2.3.5.2. Arithmetischer Ausdruck
Die Operatoren für arithmetische Ausdrücke lauten wie folgt:
^, –, *, /, \, Mod, +, = |
+: Addition, -: Subtraktion, *: Multiplikation, /: Gleitkommadivision, \: Quotient der ganzzahligen Division, Mod: Rest der ganzzahligen Division, ^: Potenzierung. Somit ergibt sich folgendes Programm:
' arithmetic operators
Module operateursarithmetiques
Sub Main()
Dim i, j As Integer
i = 4 : j = 3
Console.Out.WriteLine(i & "/" & j & "=" & (i / j))
Console.Out.WriteLine(i & "\" & j & "=" & (i \ j))
Console.Out.WriteLine(i & " mod " & j & "=" & (i Mod j))
Dim r1, r2 As Double
r1 = 4.1 : r2 = 3.6
Console.Out.WriteLine(r1 & "/" & r2 & "=" & (r1 / r2))
Console.Out.WriteLine(r1 & "^2=" & (r1 ^ 2))
Console.Out.WriteLine(Math.Cos(3))
End Sub
End Module
liefert folgende Ergebnisse:
Es gibt verschiedene mathematische Funktionen. Hier sind einige davon:
| Quadratwurzel |
| Kosinus |
| Sinus |
| Tangens |
| x hoch y (x > 0) |
| Exponential |
| Natürlicher Logarithmus |
| Absolutwert |
Alle diese Funktionen sind in einer .NET-Klasse namens Math definiert. Wenn Sie sie verwenden, müssen Sie ihnen den Namen der Klasse voranstellen, in der sie definiert sind. Sie würden also schreiben:
Die vollständige Definition der Math-Klasse lautet wie folgt:
Stellt den natürlichen Logarithmus zur Basis e dar, die durch die Konstante e angegeben wird. | ||||
Bezeichnet das Verhältnis des Umfangs eines Kreises zu seinem Durchmesser, das durch die Konstante π angegeben wird. | ||||
Überladen. Gibt den Absolutwert einer angegebenen Zahl zurück. | ||||
Gibt den Winkel zurück, dessen Kosinus die angegebene Zahl ist. | ||||
Gibt den Winkel zurück, dessen Sinus der angegebene Wert ist. | ||||
Gibt den Winkel zurück, dessen Tangens der angegebene Wert ist. | ||||
Gibt den Winkel zurück, dessen Tangens der Quotient aus zwei angegebenen Zahlen ist. | ||||
Erzeugt das ganzzahlige Produkt zweier 32-Bit-Zahlen. | ||||
Gibt die kleinste ganze Zahl zurück, die größer oder gleich der angegebenen Zahl ist. | ||||
Gibt den Kosinus des angegebenen Winkels zurück. | ||||
Gibt den hyperbolischen Kosinus des angegebenen Winkels zurück. | ||||
Überladen. Gibt den Quotienten zweier Zahlen zurück und übergibt den Rest als Ausgabeparameter. | ||||
Gibt e hoch der angegebenen Potenz zurück. | ||||
Gibt die größte ganze Zahl zurück, die kleiner oder gleich der angegebenen Zahl ist. | ||||
Gibt den Rest der Division einer Zahl durch eine andere zurück. | ||||
Überladen. Gibt den Logarithmus einer angegebenen Zahl zurück. | ||||
Gibt den Logarithmus zur Basis 10 einer angegebenen Zahl zurück. | ||||
Überladen. Gibt die größere der beiden angegebenen Zahlen zurück. | ||||
Überladen. Gibt die kleinere der beiden Zahlen zurück. | ||||
Gibt eine angegebene Zahl zur angegebenen Potenz zurück. | ||||
Überladen. Gibt die Zahl zurück, die dem angegebenen Wert am nächsten liegt. | ||||
Überladen. Gibt einen Wert zurück, der das Vorzeichen einer Zahl angibt. | ||||
Gibt den Sinus des angegebenen Winkels zurück. | ||||
Gibt den hyperbolischen Sinus des angegebenen Winkels zurück. | ||||
Gibt die Quadratwurzel einer angegebenen Zahl zurück. | ||||
Gibt den Tangens des angegebenen Winkels zurück. | ||||
Gibt den hyperbolischen Tangens des angegebenen Winkels zurück. | ||||
Wenn eine Funktion als „überladen“ deklariert wird, bedeutet dies, dass sie für verschiedene Parametertypen existiert. Beispielsweise existiert die Funktion Abs(x) für x vom Typ Integer, Long, Decimal, Single und Float. Für jeden dieser Typen gibt es eine separate Definition der Abs-Funktion. Man spricht dann von einer überladenen Funktion.
2.3.5.3. Operatoren bei der Auswertung arithmetischer Ausdrücke
Die Operatorpriorität bei der Auswertung eines arithmetischen Ausdrucks ist wie folgt (von der höchsten zur niedrigsten):
Kategorie | Operatoren |
Alle Ausdrücke ohne Operatoren: Funktionen, Klammern | |
^ | |
+, - | |
*, / | |
\ | |
Mod | |
+, - |
2.3.5.4. Relationale Ausdrücke
Es gibt folgende Operatoren:
=, <>, <, >, <=, >=, Like, Is |
=: gleich, <>: ungleich, <: kleiner als (strikt), >: größer als (strikt), <=: kleiner oder gleich, >=: größer oder gleich, Like: entspricht einem Muster, Is: Objektidentität. Alle diese Operatoren haben denselben Vorrang. Sie werden von links nach rechts ausgewertet. Das Ergebnis eines relationalen Ausdrucks ist ein Boolescher Wert.
Zeichenfolgenvergleich: Betrachten Sie das folgende Programm:
' namespaces
Imports System
Module string1
Sub main()
Dim ch1 As Char = "A"c
Dim ch2 As Char = "B"c
Dim ch3 As Char = "a"c
Console.Out.WriteLine("A<B=" & (ch1 < ch2))
Console.Out.WriteLine("A<a=" & (ch1 < ch3))
Dim chat As String = "chat"
Dim chien As String = "chien"
Dim chaton As String = "chaton"
Dim chat2 As String = "CHAT"
Console.Out.WriteLine("chat<chien=" & (chat < chien))
Console.Out.WriteLine("chat<chaton=" & (chat < chaton))
Console.Out.WriteLine("chat<CHAT=" & (chat < chat2))
Console.Out.WriteLine("chaton like chat*=" & ("chaton" Like "chat*"))
End Sub
End Module
und das Ergebnis der Ausführung:
Es seien zwei Zeichen C1 und C2 gegeben. Sie können mit den Operatoren <, <=, =, <>, >, >= verglichen werden. Verglichen werden ihre Unicode-Werte – also Zahlen. Gemäß der Unicode-Reihenfolge gelten die folgenden Beziehungen:
Leerzeichen < .. < '0' < '1' < .. < '9' < .. < 'A' < 'B' < .. < 'Z' < .. < 'a' < 'b' < .. < 'z'
Zeichenketten werden Zeichen für Zeichen verglichen. Die erste Ungleichheit, auf die man zwischen zwei Zeichen stößt, impliziert eine Ungleichheit gleichen Vorzeichens für die Zeichenketten. Mit diesen Erläuterungen sei der Leser eingeladen, die Ergebnisse des vorherigen Programms zu untersuchen.
2.3.5.5. Boolesche Ausdrücke
Die Operatoren lauten wie folgt:
Nicht, Und, Oder, XOR, UndAuch, OderSonst |
Nicht: logisches UND, Oder: logisches ODER, Nicht: Negation, XOR: exklusives ODER.
op1 AndAlso op2: Wenn op1 falsch ist, wird op2 nicht ausgewertet und das Ergebnis ist falsch.
op1 OrElse op2: Wenn op1 wahr ist, wird op2 nicht ausgewertet und das Ergebnis ist wahr.
Die Rangfolge dieser Operatoren zueinander ist wie folgt:
Logisches NICHT | |
Und, Und-Auch | |
ODER, OrElse | |
XOR |
Das Ergebnis eines booleschen Ausdrucks ist ein Boolescher Wert.
2.3.5.6. Bitweise Operationen
Einerseits finden wir dieselben Operatoren wie bei den booleschen Operatoren mit derselben Priorität. Außerdem gibt es zwei Verschiebungsoperatoren: << und >>. Seien i und j zwei ganze Zahlen.
verschiebt i um n Bits nach links. Die eingehenden Bits sind Nullen. | |
verschiebt i um n Bits nach rechts. Wenn i eine vorzeichenbehaftete Ganzzahl ist (signed char, int, long), bleibt das Vorzeichenbit erhalten. | |
führt eine bitweise logische UND-Verknüpfung von i und j durch. | |
führt eine bitweise ODER-Operation auf i und j aus. | |
komplementiert i zu 1 | |
führt die XOR-Operation von i und j durch |
Betrachten Sie das folgende Programm:
Module operationsbit
Sub main()
' bit manipulation
Dim i As Short = &H123F
Dim k As Short = &H7123
Console.Out.WriteLine("i<<4=" & (i << 4).ToString("X"))
Console.Out.WriteLine("i>>4=" & (i >> 4).ToString("X"))
Console.Out.WriteLine("k>>4=" & (k >> 4).ToString("X"))
Console.Out.WriteLine("i and 4=" & (i And 4).ToString("X"))
Console.Out.WriteLine("i or 4 =" & (i Or 4).ToString("X"))
Console.Out.WriteLine("not i=" & (Not i).ToString("X"))
End Sub
End Module
Die Ausführung liefert folgende Ergebnisse:
2.3.5.7. Mit der Zuweisung verbundener Operator
Es ist möglich, a+=b zu schreiben, was a=a+b bedeutet. Die Liste der Operatoren, die mit der Zuweisungsoperation kombiniert werden können, lautet wie folgt:
^=, *=, /=, \=, +=, -=, &= |
2.3.5.8. Allgemeine Operatorpriorität
Kategorie | Operatoren |
Alle Ausdrücke ohne Operatoren | |
^ | |
+, - | |
*, / | |
\ | |
Mod | |
+, - | |
& | |
<<, >> | |
=, <>, <, >, <=, >=, Like, Is, TypeOf...Is | |
Nicht | |
Und, UndAuch | |
ODER, OrElse | |
XOR |
Wenn ein Operand zwischen zwei Operatoren gleicher Priorität steht, bestimmt die Assoziativität der Operatoren die Reihenfolge, in der die Operationen ausgeführt werden. Alle Operatoren sind linksassoziativ, was bedeutet, dass Operationen von links nach rechts ausgeführt werden. Priorität und Assoziativität können mithilfe von Ausdrücken in Klammern gesteuert werden.
2.3.5.9. Typkonvertierungen
Es gibt eine Reihe vordefinierter Funktionen, mit denen Sie von einem Datentyp in einen anderen konvertieren können. Die Liste lautet wie folgt:
Diese Funktionen akzeptieren einen numerischen Ausdruck oder eine Zeichenfolge als Argument. Der Ergebnistyp ist in der folgenden Tabelle aufgeführt:
Funktion | Ergebnis | Wertebereich des Funktionsparameters |
Boolescher Wert | Jeder gültige Zeichenfolgen- oder numerische Ausdruck. | |
Byte | 0 bis 255; Bruchteile werden gerundet. | |
Char | Jeder gültige String-Ausdruck; der Wert kann zwischen 0 und 65.535 liegen. | |
Date | Jede gültige Darstellung von Datum und Uhrzeit. | |
Double | -1,79769313486231E+308 bis -4,94065645841247E-324 für negative Werte; 4,94065645841247E-324 bis 1,79769313486231E+308 für positive Werte. | |
Dezimal | +/-79.228.162.514.264.337.593.543.950.335 für nicht-dezimale Zahlen. Der Wertebereich für 28-stellige Dezimalzahlen beträgt +/-7,9228162514264337593543950335. Die kleinste Zahl ungleich Null ist 0,0000000000000000000000000001. | |
Ganzzahl | -2.147.483.648 bis 2.147.483.647; Bruchteile werden gerundet. | |
Long | -9.223.372.036.854.775.808 bis 9.223.372.036.854.775.807; Bruchteile werden gerundet. | |
Objekt | Jeder gültige Ausdruck. | |
Short | -32.768 bis 32.767; Bruchteile werden gerundet. | |
Einzeln | -3,402823E+38 bis -1,401298E-45 für negative Werte; 1,401298E-45 bis 3,402823E+38 für positive Werte. | |
Zeichenkette | Die von der Funktion Cstr zurückgegebenen Werte hängen vom Argument „expression“ ab. |
Hier ist ein Beispielprogramm:
Module conversion
Sub main()
Dim var1 As Boolean = CBool("true")
Dim var2 As Byte = CByte("100")
Dim var3 As Char = CChar("A")
Dim var4 As Date = CDate("30 janvier 2004")
Dim var5 As Double = CDbl("100,45")
Dim var6 As Decimal = CDec("1000,67")
Dim var7 As Integer = CInt("-30")
Dim var8 As Long = CLng("456")
Dim var9 As Short = CShort("-14")
Dim var10 As Single = CSng("56,78")
Console.Out.WriteLine("var1=" & var1)
Console.Out.WriteLine("var2=" & var2)
Console.Out.WriteLine("var3=" & var3)
Console.Out.WriteLine("var4=" & var4)
Console.Out.WriteLine("var5=" & var5)
Console.Out.WriteLine("var6=" & var6)
Console.Out.WriteLine("var7=" & var7)
Console.Out.WriteLine("var8=" & var8)
Console.Out.WriteLine("var9=" & var9)
Console.Out.WriteLine("var10=" & var10)
End Sub
End Module
und die Ergebnisse der Ausführung:
var1=True
var2=100
var3=A
var4=30/01/2004
var5=100,45
var6=1000,67
var7=-30
var8=456
var9=-14
var10=56,78
Sie können auch die Funktion CType(Ausdruck, Typ) verwenden, wie im folgenden Programm gezeigt:
Module ctype1
Sub main()
Dim var1 As Boolean = CType("true", Boolean)
Dim var2 As Byte = CType("100", Byte)
Dim var3 As Char = CType("A", Char)
Dim var4 As Date = CType("30 janvier 2004", Date)
Dim var5 As Double = CType("100,45", Double)
Dim var6 As Decimal = CType("1000,67", Decimal)
Dim var7 As Integer = CType("-30", Integer)
Dim var8 As Long = CType("456", Long)
Dim var9 As Short = CType("-14", Short)
Dim var10 As Single = CType("56,78", Single)
Dim var11 As String = CType("47,89", String)
Dim var12 As String = 47.89.ToString
Dim var13 As String = "" & 47.89
Console.Out.WriteLine("var1=" & var1)
Console.Out.WriteLine("var2=" & var2)
Console.Out.WriteLine("var3=" & var3)
Console.Out.WriteLine("var4=" & var4)
Console.Out.WriteLine("var5=" & var5)
Console.Out.WriteLine("var6=" & var6)
Console.Out.WriteLine("var7=" & var7)
Console.Out.WriteLine("var8=" & var8)
Console.Out.WriteLine("var9=" & var9)
Console.Out.WriteLine("var10=" & var10)
Console.Out.WriteLine("var11=" & var11)
Console.Out.WriteLine("var12=" & var12)
Console.Out.WriteLine("var13=" & var13)
End Sub
End Module
was zu folgenden Ergebnissen führt:
var1=True
var2=100
var3=A
var4=30/01/2004
var5=100,45
var6=1000,67
var7=-30
var8=456
var9=-14
var10=56,78
var11=47,89
var12=47,89
var13=47,89
2.4. Anweisungen zur Steuerung der Programmausführung
2.4.1. Stopp
Mit der in der Klasse „Environment“ definierten Methode „Exit“ können Sie die Ausführung eines Programms anhalten:
[Visual Basic]
Public Shared Sub Exit(ByVal exitCode As Integer )
beendet den aktuellen Prozess und gibt den Wert von exitCode an den übergeordneten Prozess zurück. Der Wert von exitCode kann vom übergeordneten Prozess verwendet werden. Unter DOS wird diese Statusvariable in der Systemvariablen ERRORLEVEL an DOS zurückgegeben, deren Wert in einer Batch-Datei überprüft werden kann. Unter Unix ruft die Variable $? den Wert von exitCode ab.
beendet das Programm mit einem Exit-Status von 0.
2.4.2. Einfache Entscheidungsstruktur
- Jede Aktion steht in einer eigenen Zeile
- Die else-Klausel kann weggelassen werden.
Sie können Entscheidungsstrukturen wie im folgenden Beispiel gezeigt verschachteln:
' options
Option Explicit On
Option Strict On
' namespaces
Imports System
Module if1
Sub main()
Dim i As Integer = 10
If i > 4 Then
Console.Out.WriteLine(i & " est > " & 4)
Else
If i = 4 Then
Console.Out.WriteLine(i & " est = " & 4)
Else
Console.Out.WriteLine(i & " est < " & 4)
End If
End If
End Sub
End Module
Das erzielte Ergebnis:
2.4.3. Fallstruktur
Die Syntax lautet wie folgt:
select case expression
case liste_valeurs1
actions1
case liste_valeurs2
actions2
...
case else
actions_sinon
end select
- Der Typ von [Ausdruck] muss einer der folgenden Typen sein:
- Die Klausel [case else] kann weggelassen werden.
- [list_of_values] sind mögliche Werte des Ausdrucks. [lists_of_values] stellt eine Liste von Bedingungen condition1, condition2, ..., conditionx dar. Wenn [expression] eine der Bedingungen erfüllt, werden die auf die [list_of_values]-Klausel folgenden Aktionen ausgeführt. Die Bedingungen können folgende Form annehmen:
- val1 bis val2: wahr, wenn [Ausdruck] im Bereich [val1,val2] liegt
- val1: wahr, wenn [Ausdruck] gleich val1 ist
- ist > val1: wahr, wenn [Ausdruck] > val1 ist. Das Schlüsselwort [ist] kann weggelassen werden
- Das Gleiche gilt für die Operatoren =, <, <=, >, >=, <>
- Es werden nur die Aktionen ausgeführt, die mit der ersten überprüften Bedingung verknüpft sind.
Betrachten Sie das folgende Programm:
' options
Option Explicit On
Option Strict On
' namespaces
Imports System
Module selectcase1
Sub main()
Dim i As Integer = 10
Select Case i
Case 1 To 4, 7 To 8
Console.Out.WriteLine("i est dans l'intervalle [1,4] ou [7,8]")
Case Is > 12
Console.Out.WriteLine("i est > 12")
Case Is < 15
Console.Out.WriteLine("i est < 15")
Case Is < 20
Console.Out.WriteLine("i est < 20")
End Select
End Sub
End Module
Dies führt zu folgenden Ergebnissen:
2.4.4. Schleifenstruktur
2.4.4.1. Bekannte Anzahl von Iterationen
For counter [ As datatype ] = start To end [ Step step ]
actions
Next [ counter ]
Aktionen werden für jeden Wert der Variablen [Zähler] ausgeführt. Betrachten Sie das folgende Programm:
' options
Option Explicit On
Option Strict On
' namespaces
Imports System
Module for1
Sub main()
Dim somme As Integer = 0
Dim résultat As String = "somme("
For i As Integer = 0 To 10 Step 2
somme += i
résultat += " " + i.ToString
Next
résultat += ")=" + somme.ToString
Console.Out.WriteLine(résultat)
End Sub
End Module
Die Ergebnisse:
Eine weitere Iterationsstruktur mit einer bekannten Anzahl von Iterationen sieht wie folgt aus:
For Each element [ As datatype ] In groupe
[ actions ]
Next [ element ]
- Eine Gruppe ist eine Sammlung von Objekten. Die uns bereits bekannte Sammlung von Objekten ist das Array
- Der Datentyp ist der Typ der Objekte in der Sammlung. Bei einem Array wäre dies der Typ der Array-Elemente
- element ist eine lokale Variable der Schleife, die nacheinander die Werte der Sammlung annimmt.
Daher gilt für den folgenden Code:
' options
Option Explicit On
Option Strict On
' namespaces
Imports System
Module foreach1
Sub main()
Dim amis() As String = {"paul", "hélène", "jacques", "sylvie"}
For Each nom As String In amis
Console.Out.WriteLine(nom)
Next
End Sub
End Module
würde Folgendes anzeigen:
2.4.4.2. Anzahl der Wiederholungen unbekannt
In VB.NET gibt es für diesen Fall viele Strukturen.
Do { While | Until } condition
[ statements ]
Loop
Die Schleife wird so lange fortgesetzt, wie die Bedingung wahr ist (while) oder bis die Bedingung wahr ist (until). Die Schleife wird möglicherweise nie ausgeführt.
Do
[ statements ]
Loop { While | Until } condition
Die Schleife wird so lange fortgesetzt, wie die Bedingung wahr ist (while) oder bis die Bedingung wahr ist (until). Die Schleife wird immer mindestens einmal ausgeführt.
While condition
[ statements ]
End While
Die Schleife wird so lange fortgesetzt, wie die Bedingung wahr ist. Die Schleife wird möglicherweise nie ausgeführt. Die folgenden Schleifen berechnen alle die Summe der ersten 10 ganzen Zahlen.
' options
Option Explicit On
Option Strict On
' namespaces
Imports System
Module boucles1
Sub main()
Dim i, somme As Integer
i = 0 : somme = 0
Do While i < 11
somme += i
i += 1
Loop
Console.Out.WriteLine("somme=" + somme.ToString)
i = 0 : somme = 0
Do Until i = 11
somme += i
i += 1
Loop
Console.Out.WriteLine("somme=" + somme.ToString)
i = 0 : somme = 0
Do
somme += i
i += 1
Loop Until i = 11
Console.Out.WriteLine("somme=" + somme.ToString)
i = 0 : somme = 0
Do
somme += i
i += 1
Loop While i < 11
Console.Out.WriteLine("somme=" + somme.ToString)
End Sub
End Module
2.4.4.3. Schleifenanweisungen
Beendet eine do...loop-Schleife | |
Beendet eine for-Schleife |
2.5. Der Aufbau eines VB.NET-Programms
Ein VB.NET-Programm, das außer der Hauptfunktion Main keine benutzerdefinierten Klassen oder Funktionen verwendet, kann folgende Struktur aufweisen:
' options
Option Explicit On
Option Strict On
' namespaces
Imports espace1
Imports ....
Module nomDuModule
Sub main()
....
End Sub
End Module
- Die Anweisung [Option Explicit on] erzwingt die Deklaration von Variablen. In VB.NET ist dies nicht zwingend erforderlich. Eine nicht deklarierte Variable ist dann vom Typ Object.
- Die Anweisung [Option Strict on] verbietet alle Datentypkonvertierungen, die zu Datenverlust führen könnten, sowie alle Konvertierungen zwischen numerischen Typen und Zeichenfolgen. Konvertierungsfunktionen müssen daher explizit verwendet werden.
- Das Programm importiert alle benötigten Namespaces. Dieses Konzept haben wir bisher noch nicht behandelt. In früheren Programmen sind wir oft auf Anweisungen wie die folgenden gestoßen:
Eigentlich hätten wir schreiben sollen:
wobei System der Namespace ist, der die Klasse [Console] enthält. Durch das Importieren des Namespaces [System] mit einer Imports-Anweisung durchsucht VB.NET diesen systematisch, sobald es auf eine Klasse stößt, die es nicht erkennt. Die Suche wird in allen deklarierten Namespaces wiederholt, bis die betreffende Klasse gefunden wird. Wir schreiben daher:
' namespaces
Imports System
....
Console.Out.WriteLine(unechaine)
Ein Beispielprogramm könnte wie folgt aussehen:
' options
Option Explicit On
Option Strict On
'namespaces
Imports System
' main module
Module main1
Sub main()
Console.Out.WriteLine("main1")
End Sub
End Module
Das gleiche Programm lässt sich wie folgt schreiben:
' options
Option Explicit On
Option Strict On
'namespaces
Imports System
' test class
Public Class main2
Public Shared Sub main()
Console.Out.WriteLine("main2")
End Sub
End Class
Hier verwenden wir das Konzept einer Klasse, das im nächsten Kapitel vorgestellt wird. Wenn eine solche Klasse eine statische (gemeinsam genutzte) Prozedur namens main enthält, wird diese ausgeführt. Wir fügen diesen Code hier ein, da C#, die Schwestersprache von VB.NET, nur das Konzept von Klassen kennt – das heißt, jeder ausgeführte Code muss zu einer Klasse gehören. Das Konzept der Klassen ist Teil der objektorientierten Programmierung. Es auf das Design jedes Programms anzuwenden, ist etwas umständlich. Wir sehen dies hier in Version 2 des vorherigen Programms, wo wir gezwungen sind, die Konzepte von Klassen und statischen Methoden einzuführen, wo sie nicht benötigt werden. Daher werden wir von nun an das Konzept einer Klasse nur dann einführen, wenn es notwendig ist. In anderen Fällen werden wir das Konzept eines Moduls verwenden, wie in Version 1 oben.
2.6. Kompilieren und Ausführen eines VB.NET-Programms
Zum Kompilieren eines VB.NET-Programms ist lediglich das .NET SDK erforderlich. Betrachten Sie das folgende Programm:
' options
Option Explicit On
Option Strict On
' namespaces
Imports System
Module boucles1
Sub main()
Dim i, somme As Integer
i = 0 : somme = 0
Do While i < 11
somme += i
i += 1
Loop
Console.Out.WriteLine("somme=" + somme.ToString)
i = 0 : somme = 0
Do Until i = 11
somme += i
i += 1
Loop
Console.Out.WriteLine("somme=" + somme.ToString)
i = 0 : somme = 0
Do
somme += i
i += 1
Loop Until i = 11
Console.Out.WriteLine("somme=" + somme.ToString)
i = 0 : somme = 0
Do
somme += i
i += 1
Loop While i < 11
Console.Out.WriteLine("somme=" + somme.ToString)
End Sub
End Module
Nehmen wir an, es befindet sich in einer Datei namens [loops1.vb]. Um es zu kompilieren, gehen wir wie folgt vor:
dos>dir boucles1.vb
11/03/2004 15:55 583 boucles1.vb
dos>vbc boucles1.vb
Compilateur Microsoft (R) Visual Basic .NET version 7.10.3052.4
pour Microsoft (R) .NET Framework version 1.1.4322.573
Copyright (C) Microsoft Corporation 1987-2002. Tous droits réservés.
dos>dir boucles1.*
11/03/2004 16:04 601 boucles1.vb
11/03/2004 16:04 3 584 boucles1.exe
Das Programm vbc.exe ist der VB.NET-Compiler. Hier befand es sich im DOS-PATH:
dos>path
PATH=E:\Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE;E:\Program Files\Microsoft Visual Studio .NET 2003\VC7\BIN;E:\Program Files\Microsoft Visual Studio .NET 2003\Common7\Tools;E:\Program Files\Microsoft Visual Studio .NET 2003\Common7\Tools\bin\prerelease;E:\Program Files\Microsoft Visual Studio .NET 2003\Common7\Tools\bin;E:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\bin;E:\WINNT\Microsoft.NET\Framework\v1.1.4322;e:\winnt\system32;e:\winnt;
dos>dir E:\WINNT\Microsoft.NET\Framework\v1.1.4322\vbc.exe
21/02/2003 10:20 737 280 vbc.exe
Der [vbc]-Compiler erzeugt eine .exe-Datei, die von der .NET-Virtual Machine ausgeführt werden kann:
2.7. Beispiel zur Steuerberechnung
Wir schlagen vor, ein Programm zu schreiben, das die Steuer eines Steuerpflichtigen berechnet. Wir betrachten den vereinfachten Fall eines Steuerpflichtigen, der nur sein Gehalt anzugeben hat:
- Wir berechnen die Anzahl der Steuerklassen für den Arbeitnehmer als nbParts = nbEnfants / 2 + 1, wenn er unverheiratet ist, und als nbEnfants / 2 + 2, wenn er verheiratet ist, wobei nbEnfants die Anzahl der Kinder ist.
- Wenn er mindestens drei Kinder hat, erhält er einen zusätzlichen halben Anteil
- Wir berechnen sein zu versteuerndes Einkommen R = 0,72 * S, wobei S sein Jahresgehalt ist
- Wir berechnen ihren Familienkoeffizienten QF = R / nbParts
- Wir berechnen ihre Steuer I. Betrachten Sie die folgende Tabelle:
12620,0 | 0 | 0 |
13.190 | 0,05 | 631 |
15.640 | 0,1 | 1.290,5 |
24.740 | 0,15 | 2.072,5 |
31.810 | 0,2 | 3.309,5 |
39.970 | 0,25 | 4900 |
48.360 | 0,3 | 6.898,5 |
55.790 | 0,35 | 9.316,5 |
92.970 | 0,4 | 12.106 |
127.860 | 0,45 | 16.754,5 |
151.250 | 0,50 | 23.147,5 |
172.040 | 0,55 | 30.710 |
195.000 | 0,60 | 39.312 |
0 | 0,65 | 49062 |
Jede Zeile enthält 3 Felder. Um die Steuer I zu berechnen, suchen Sie die erste Zeile, in der QF <= Feld1 ist. Wenn beispielsweise QF = 23.000 ist, lautet die gefundene Zeile
Steuer I ist dann gleich 0,15*R – 2072,5*nbParts. Wenn QF so ist, dass die Bedingung QF<=field1 nie erfüllt ist, werden die Koeffizienten aus der letzten Zeile verwendet. Hier:
was die Steuer I = 0,65*R - 49062*nbParts ergibt. Das entsprechende VB.NET-Programm lautet wie folgt:
' options
Option Explicit On
Option Strict On
' namespaces
Imports System
Module impots
' ------------ hand
Sub Main()
' data tables required for tax calculation
Dim Limites() As Decimal = {12620D, 13190D, 15640D, 24740D, 31810D, 39970D, 48360D, 55790D, 92970D, 127860D, 151250D, 172040D, 195000D, 0D}
Dim CoeffN() As Decimal = {0D, 631D, 1290.5D, 2072.5D, 3309.5D, 4900D, 6898.5D, 9316.5D, 12106D, 16754.5D, 23147.5D, 30710D, 39312D, 49062D}
' we recover marital status
Dim OK As Boolean = False
Dim reponse As String = Nothing
While Not OK
Console.Out.Write("Etes-vous marié(e) (O/N) ? ")
reponse = Console.In.ReadLine().Trim().ToLower()
If reponse <> "o" And reponse <> "n" Then
Console.Error.WriteLine("Réponse incorrecte. Recommencez")
Else
OK = True
End If
End While
Dim Marie As Boolean = reponse = "o"
' number of children
OK = False
Dim NbEnfants As Integer = 0
While Not OK
Console.Out.Write("Nombre d'enfants : ")
reponse = Console.In.ReadLine()
Try
NbEnfants = Integer.Parse(reponse)
If NbEnfants >= 0 Then
OK = True
Else
Console.Error.WriteLine("Réponse incorrecte. Recommencez")
End If
Catch
Console.Error.WriteLine("Réponse incorrecte. Recommencez")
End Try
End While
' salary
OK = False
Dim Salaire As Integer = 0
While Not OK
Console.Out.Write("Salaire annuel : ")
reponse = Console.In.ReadLine()
Try
Salaire = Integer.Parse(reponse)
If Salaire >= 0 Then
OK = True
Else
Console.Error.WriteLine("Réponse incorrecte. Recommencez")
End If
Catch
Console.Error.WriteLine("Réponse incorrecte. Recommencez")
End Try
End While
' calculating the number of shares
Dim NbParts As Decimal
If Marie Then
NbParts = CDec(NbEnfants) / 2 + 2
Else
NbParts = CDec(NbEnfants) / 2 + 1
End If
If NbEnfants >= 3 Then
NbParts += 0.5D
End If
' taxable income
Dim Revenu As Decimal
Revenu = 0.72D * Salaire
' family quotient
Dim QF As Decimal
QF = Revenu / NbParts
' search for tax bracket corresponding to QF
Dim i As Integer
Dim NbTranches As Integer = Limites.Length
Limites((NbTranches - 1)) = QF
i = 0
While QF > Limites(i)
i += 1
End While
' tax
Dim impots As Integer = CInt(i * 0.05D * Revenu - CoeffN(i) * NbParts)
' the result is displayed
Console.Out.WriteLine(("Impôt à payer : " & impots))
End Sub
End Module
Das Programm wird in einem DOS-Fenster mit folgendem Befehl kompiliert:
dos>vbc impots1.vb
Compilateur Microsoft (R) Visual Basic .NET version 7.10.3052.4 pour Microsoft (R) .NET Framework version 1.1.4322.573
dos>dir impots1.exe
24/02/2004 15:42 5 632 impots1.exe
Die Kompilierung erzeugt eine ausführbare Datei namens impots.exe. Beachten Sie, dass impots.exe nicht direkt vom Prozessor ausgeführt werden kann. Sie enthält tatsächlich Zwischencode, der nur auf einer .NET-Plattform ausführbar ist. Die erhaltenen Ergebnisse lauten wie folgt:
dos>impots1
Etes-vous marié(e) (O/N) ? o
Nombre d'enfants : 3
Salaire annuel : 200000
Impôt à payer : 16400
dos>impots1
Etes-vous marié(e) (O/N) ? n
Nombre d'enfants : 2
Salaire annuel : 200000
Impôt à payer : 33388
dos>impots1
Etes-vous marié(e) (O/N) ? w
Réponse incorrecte. Recommencez
Etes-vous marié(e) (O/N) ? q
Réponse incorrecte. Recommencez
Etes-vous marié(e) (O/N) ? o
Nombre d'enfants : q
Réponse incorrecte. Recommencez
Nombre d'enfants : 2
Salaire annuel : q
Réponse incorrecte. Recommencez
Salaire annuel : 1
Impôt à payer : 0
2.8. Hauptargumente des Programms
Die Hauptprozedur „Main“ kann ein Array von Zeichenfolgen als Parameter entgegennehmen:
Sub main(ByVal args() As String)
Der Parameter „args“ ist ein Array von Zeichenfolgen, das die bei Aufruf des Programms über die Befehlszeile übergebenen Argumente empfängt.
- args.Length ist die Anzahl der Elemente im Array args
- args(i) ist das i-te Element des Arrays
Wenn wir das Programm P mit dem Befehl P arg0 arg1 … argn und wenn die Main-Prozedur von Programm P wie folgt deklariert ist:
Sub main(ByVal args() As String)
dann gilt arg(0)="arg0", arg(1)="arg1" … Hier ein Beispiel:
' guidelines
Option Strict On
Option Explicit On
' namespaces
Imports System
Module arg
Sub main(ByVal args() As String)
' number of arguments
console.out.writeline("Il y a " & args.length & " arguments")
Dim i As Integer
For i = 0 To args.Length - 1
Console.Out.WriteLine("argument n° " & i & "=" & args(i))
Next
End Sub
End Module
Die Ausführung liefert folgende Ergebnisse:
2.9. Aufzählungen
Eine Aufzählung ist ein Datentyp, dessen Wertebereich eine Menge von ganzzahligen Konstanten ist. Stellen wir uns ein Programm vor, das Prüfungsnoten verarbeiten muss. Es gäbe fünf Noten: Bestanden, Befriedigend, Gut, Sehr gut, Ausgezeichnet. Wir könnten dann eine Aufzählung für diese fünf Konstanten definieren:
Enum mention
Passable
AssezBien
Bien
TrésBien
Excellent
End Enum
Intern werden diese fünf Konstanten durch aufeinanderfolgende Ganzzahlen dargestellt, beginnend mit 0 für die erste Konstante, 1 für die nächste und so weiter. Eine Variable kann so deklariert werden, dass sie diese Werte in der Aufzählung annimmt:
' a variable that takes its values from the enumeration mentioned
Dim maMention As mention = mention.Passable
Eine Variable kann mit den verschiedenen möglichen Werten der Aufzählung verglichen werden:
' test avec valeur de l'énumération
If (maMention = mention.Passable) Then
Console.Out.WriteLine("Peut mieux faire")
End If
Sie können alle Werte der Aufzählung abrufen:
For Each m In mention.GetValues(maMention.GetType)
Console.Out.WriteLine(m)
Next
Genauso wie der einfache Typ „Integer“ der Struktur „Int32“ entspricht, entspricht der einfache Typ „Enum“ der Struktur „Enum“. Diese Klasse verfügt über eine statische Methode „GetValues“, mit der Sie alle Werte eines als Parameter übergebenen Aufzählungstyps abrufen können. Dieser Parameter muss ein Objekt vom Typ „Type“ sein, einer Klasse, die Informationen über einen Datentyp bereitstellt. Der Typ einer Variablen v wird über v.GetType() ermittelt. Hier gibt also maMention.GetType() das Type-Objekt für die Aufzählung „mentions“ zurück, und Enum.GetValues(maMention.GetType()) gibt die Liste der Werte für die Aufzählung „mentions“ zurück.
Dies wird im folgenden Programm veranschaulicht:
' guidelines
Option Strict On
Option Explicit On
' namespaces
Imports System
Public Module enum2
' an enumeration
Enum mention
Passable
AssezBien
Bien
TrèsBien
Excellent
End Enum
' test pg
Sub Main()
' a variable that takes its values from the enumeration mentioned
Dim maMention As mention = mention.Passable
' variable value display
Console.Out.WriteLine("mention=" & maMention)
' test with enumeration value
If (maMention = mention.Passable) Then
Console.Out.WriteLine("Peut mieux faire")
End If
' list of literal mentions
For Each m As mention In [Enum].GetValues(maMention.GetType)
Console.Out.WriteLine(m.ToString)
Next
' list of full mentions
For Each m As Integer In [Enum].GetValues(maMention.GetType)
Console.Out.WriteLine(m)
Next
End Sub
End Module
Die Ausführungsergebnisse lauten wie folgt:
2.10. Ausnahmebehandlung
Viele VB.NET-Funktionen können Ausnahmen, d. h. Fehler, auslösen. Wenn eine Funktion eine Ausnahme auslösen kann, sollte der Programmierer diese behandeln, um Programme zu erstellen, die widerstandsfähiger gegen Fehler sind: Sie sollten stets vermeiden, dass eine Anwendung unerwartet „abstürzt“.
Die Ausnahmebehandlung folgt diesem Muster:
try
appel de la fonction susceptible de générer l'exception
catch e as Exception e)
traiter l'exception e
end try
instruction suivante
Wenn die Funktion keine Ausnahme auslöst, fährt das Programm mit der nächsten Anweisung fort; andernfalls springt es in den Körper der catch-Klausel und fährt dann mit der nächsten Anweisung fort. Beachten Sie folgende Punkte:
- e ist ein vom Typ Exception abgeleitetes Objekt. Wir können genauer sein, indem wir Typen wie IOException, SystemException usw. verwenden: Es gibt verschiedene Arten von Ausnahmen. Indem wir catch e als Exception schreiben, geben wir an, dass wir alle Arten von Ausnahmen behandeln wollen. Wenn der Code im try-Block wahrscheinlich mehrere Arten von Ausnahmen erzeugt, möchten wir vielleicht genauer sein, indem wir die Ausnahme mit mehreren catch-Blöcken behandeln:
try
appel de la fonction susceptible de générer l'exception
catch e as IOException
traiter l'exception e
catch e as SystemException
traiter l'exception e
end try
instruction suivante
- Sie können try/catch-Blöcken eine finally-Klausel hinzufügen:
try
appel de la fonction susceptible de générer l'exception
catch e as Exception
traiter l'exception e
finally
code exécuté après try ou catch
end try
instruction suivante
Unabhängig davon, ob eine Ausnahme auftritt oder nicht, wird der Code in der finally-Klausel immer ausgeführt.
- In der catch-Klausel möchten Sie möglicherweise nicht das verfügbare Exception-Objekt verwenden. Anstatt catch e as Exception zu schreiben, schreiben Sie catch.
- Die Exception-Klasse verfügt über eine Message-Eigenschaft, die eine Meldung enthält, die den aufgetretenen Fehler detailliert beschreibt. Wenn Sie diese Meldung also anzeigen möchten, würden Sie schreiben:
catch e as Exception
Console.Error.WriteLine("L'erreur suivante s'est produite : "+e.Message);
...
end try
- Die Klasse „Exception“ verfügt über eine ToString-Methode, die eine Zeichenfolge zurückgibt, die den Ausnahmetyp und den Wert der Message-Eigenschaft angibt. Wir können daher schreiben:
catch ex as Exception
Console.Error.WriteLine("L'erreur suivante s'est produite : "+ex.ToString)
...
end try
Das folgende Beispiel zeigt eine Ausnahme, die durch die Verwendung eines nicht vorhandenen Array-Elements ausgelöst wird:
' options
Option Explicit On
Option Strict On
' namespaces
Imports System
Module tab1
Sub Main()
' declaring & initializing an array
Dim tab() As Integer = {0, 1, 2, 3}
Dim i As Integer
' table display with for
For i = 0 To tab.Length - 1
Console.Out.WriteLine(("tab[" & i & "]=" & tab(i)))
Next i
' table display with a for each
Dim élmt As Integer
For Each élmt In tab
Console.Out.WriteLine(élmt)
Next élmt
' generating an exception
Try
tab(100) = 6
Catch e As Exception
Console.Error.WriteLine(("L'erreur suivante s'est produite : " & e.Message))
End Try
End Sub
End Module
Die Ausführung des Programms liefert folgende Ergebnisse:
dos>exception1
tab[0]=0
tab[1]=1
tab[2]=2
tab[3]=3
0
1
2
3
L'erreur suivante s'est produite : L'index se trouve en dehors des limites du tableau.
Hier ist ein weiteres Beispiel, in dem wir die Ausnahme behandeln, die dadurch verursacht wird, dass einer Zahl eine Zeichenkette zugewiesen wird, obwohl die Zeichenkette keine Zahl darstellt:
' options
Option Strict On
Option Explicit On
'imports
Imports System
Public Module console1
Public Sub Main()
' We ask for the name
System.Console.Write("Nom : ")
' reading response
Dim nom As String = System.Console.ReadLine()
' age requested
Dim age As Integer
Dim ageOK As Boolean = False
Do While Not ageOK
' question
Console.Out.Write("âge : ")
' reading-checking response
Try
age = Int32.Parse(System.Console.ReadLine())
If age < 0 Then Throw New Exception
ageOK = True
Catch
Console.Error.WriteLine("Age incorrect, recommencez...")
End Try
Loop
' final display
Console.Out.WriteLine("Vous vous appelez [" & nom & "] et vous avez [" & age & "] ans")
End Sub
End Module
Einige Ausführungsergebnisse:
dos>console1
Nom : dupont
âge : xx
Age incorrect, recommencez...
âge : 12
Vous vous appelez dupont et vous avez 12 ans
2.11. Parameter an eine Funktion übergeben
Hier interessiert uns, wie Parameter an eine Funktion übergeben werden. Betrachten Sie die Funktion:
Sub changeInt(ByVal a As Integer)
a = 30
Console.Out.WriteLine(("Paramètre formel a=" & a))
End Sub
In der Funktionsdefinition wird a als formaler Parameter bezeichnet. Er dient ausschließlich der Definition der Funktion changeInt. Er hätte genauso gut b heißen können. Betrachten wir nun ein Beispiel für die Verwendung dieser Funktion:
Sub Main()
Dim age As Integer = 20
changeInt(age)
Console.Out.WriteLine(("Paramètre effectif age=" & age))
End Sub
Hier, in der Anweisung changeInt(age), ist age der tatsächliche Parameter, der seinen Wert an den formalen Parameter a übergibt. Uns interessiert, wie ein formaler Parameter den Wert des entsprechenden tatsächlichen Parameters abruft.
2.11.1. Wertübergabe
Das folgende Beispiel zeigt, dass die Parameter einer Funktion/Prozedur standardmäßig per Wert übergeben werden: Das heißt, der Wert des tatsächlichen Parameters wird in den entsprechenden formalen Parameter kopiert. Es handelt sich um zwei unterschiedliche Entitäten. Wenn die Funktion den formalen Parameter ändert, bleibt der tatsächliche Parameter unverändert.
' options
Option Explicit On
Option Strict On
' passing parameters by value to a function
Imports System
Module param1
Sub Main()
Dim age As Integer = 20
changeInt(age)
Console.Out.WriteLine(("Paramètre effectif age=" & age))
End Sub
Sub changeInt(ByVal a As Integer)
a = 30
Console.Out.WriteLine(("Paramètre formel a=" & a))
End Sub
End Module
Die Ergebnisse lauten wie folgt:
Der Wert 20 des tatsächlichen Parameters wurde in den formalen Parameter a kopiert. Der formale Parameter wurde anschließend geändert. Der tatsächliche Parameter blieb unverändert. Diese Übergabemethode eignet sich für die Eingabeparameter einer Funktion.
2.11.2. Übergabe per Referenz
Bei einer Übergabe per Referenz sind der tatsächliche Parameter und der formale Parameter ein und dieselbe Entität. Wenn die Funktion den formalen Parameter ändert, wird auch der tatsächliche Parameter geändert. In VB.NET muss dem formalen Parameter das Schlüsselwort ByRef vorangestellt werden. Hier ein Beispiel:
' options
Option Explicit On
Option Strict On
' passing parameters by value to a function
Imports System
Module param2
Sub Main()
Dim age As Integer = 20
changeInt(age)
Console.Out.WriteLine(("Paramètre effectif age=" & age))
End Sub
Sub changeInt(ByRef a As Integer)
a = 30
Console.Out.WriteLine(("Paramètre formel a=" & a))
End Sub
End Module
und die Ausführungsergebnisse:
Der tatsächliche Parameter folgte der Änderung des formalen Parameters. Diese Übergabemethode eignet sich für die Ausgabeparameter einer Funktion.

