vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Mails senden, abrufen und decodieren - ganz easy ;-)  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück
Rubrik: Variablen/Strings   |   VB-Versionen: VB2005, VB200816.11.07
Swap für beliebige Variablen- und Objekt-Typen (VB 2005)

Mit Hilfe von generischen Methoden lässt sich eine universelle Swap-Funktion realisieren, die mit beliebigen Variablen- und Objekt-Typen aufgerufen werden kann.

Autor:   Dieter OtterBewertung:     [ Jetzt bewerten ]Views:  8.270 
www.tools4vb.deSystem:  Win2k, WinXP, Win7, Win8, Win10, Win11kein Beispielprojekt 

Heute möchten wir Ihnen eine der Neuerungen von VB 2005 (.NET Framework 2.0) vorstellen. Es handelt sich hierbei um die Möglichkeit eigene generische Methoden zu erstellen. Das Ganze soll am Beispiel einer einfachen SWAP-Funktion zum Vertauschen zweier Variablen-Inhalte verdeutlicht werden.

Nachfolgend eine Prozedur, die zwei INTEGER-Variablen miteinander tauscht:

Public Swap(ByRef Var1 As Integer, ByRef Var2 As Integer)
  Dim Temp As Integer = Var1
  Var1 = Var2
  Var2 = Temp
End Sub

Benötigt man diese Funktion bspw. auch für Strings, Long etc. müsste man hierfür jeweils eigene "Swap"-Funktionen erstellen, bei denen dann die Parameter-Deklaration entsprechend auf String, LongInteger etc. festgelegt ist.

Nun kommen wir zu der oben erwähnten Neuerung im .NET Framework 2.0 - den Generics.

Das .NET Framework 2.0 erlaubt es uns, Methoden zu erstellen, bei denen der Datentyp vom Compiler per Typ-Ableitung aus den beim Funktionsaufruf übergebenen Parametern ermittelt wird - und zwar durch Verwendung der Of-Klausel:

Public Sub Swap(Of Type)(ByRef Var1 As Type, ByRef Var2 As Type)
  ' Variablen vertauschen
  Dim Temp As Type = Var1
  Var1 = Var2
  Var2 = Temp
End Sub

Die SWAP-Funktion kann nun mit einem beliebigen Datentyp aufgerufen werden!

' 2 Integer-Werte vertauschen
Dim Var1 As Integer = 1
Dim Var2 As Integer = 3
Swap(Of Integer)(a, b)
' 2 String-Werte vertauschen
Dim Var1 As String = "A"
Dim Var2 As String = "Z"
Swap(Of String)(a, b)

Anmerkungen und Ergänzungen von Manfred Bohn, 05.02.09
Die beiden Parameter-Variablen müssen den identischen Datentyp besitzen.
Die VB-IDE meldet sonst einen Fehler beim Typ-Rückschluß.
Datentyp-Konvertierungen sind beim 'Swappen' nicht möglich.

' 2 Integer-Werte vertauschen
Dim Int1 As Integer = 1, Int2 As Integer = 3
Swap(Int1, Int2)
 
' Auch der ausführliche Aufruf ist möglich. die explizite Angabe des Datentyps 
' ist aber bei ByRef-Parametern redundant:
Swap(Of Integer)(Int1, Int2)
' 2 String-Referenzen vertauschen
Dim Str1 As String = "A"
Dim Str2 As String = "Z"
Swap(Str1, Str2)
' 2 Referenzen auf Bitmap-Objekte vertauschen
Dim bmp1 As New Drawing.Bitmap("pic1.jpg")
Dim bmp2 As New Drawing.Bitmap("pic2.jpg")
Swap(Bmp1, Bmp2)
' Folgender Programmierfehler wird nicht erkannt 
' und er löst auch keine Ausnahme aus:
Const sieben as Short = 7
Swap(sieben, CShort(8))

Die generische Swap-Funktion kann auch bei OPTION STRICT ON verwendet werden, weil die Typ-Ableitung und Typ-Überprüfung bereits beim Kompilieren vorgenommen wird.

Das unterscheidet sie von der "klassischen" Variante der allgemeinen Swap-Funktion, die mit Object-Parametern ausgestattet ist und deren Arbeitsweise deshalb erst zur Laufzeit ermittelt werden kann.

'SwapObj' setzt die Freigabe der späten Bindung durch OPTION STRICT OFF voraus und benötigt ein Vielfaches an Rechenzeit.

Public Sub SwapObj(ByRef Var1 As Object, ByRef Var2 As Object)
  ' Variablen vertauschen
  Dim Temp As Object = Var1
  Var1 = Var2
  Var2 = Temp
End Sub

'SwapObj' erlaubt beim Tauschen allerdings auch Konvertierungen des Datentyps:

Dim Integ As Integer = 1000, Ulng As ULong = 20000
SwapObj(Integ, Ulng)

Eine generische Swap-Funktion, die Datentyp-Konvertierungen zulässt, findet man im VB@rchiv-Tipp  Erweiterte Swap-Funktion.