Also, ich bin schon sicher. Man sollte bedenken, dass es nicht nur darum geht den Laufzeittyp festzustellen, sondern darum, dass ohne Cast, der VB Compiler gar keinen richtigen Code generieren kann, und dafür sorgen muss, dass Methoden zur Laufzeit mittels Reflection aufgerufen werden. Das ist Größenordnungen langsamer als Code wo der Typ schon bekannt ist.
Private Class c
Public i As Long
Public Sub doit()
i = i + 1
End Sub
End Class
Public Sub tc()
Dim i As Integer
Dim c1 As Object = New c
Dim st As Long = Environment.TickCount
For i = 1 To 100000
c1.doit()
Next
Dim ct As Long = Environment.TickCount - st
Dim st1 As Long = Environment.TickCount
For i = 1 To 5000000
CType(c1, c).doit()
Next
Dim ct1 As Long = Environment.TickCount - st1
Debug.WriteLine(ct.ToString() & " / " & ct1.ToString())
End Sub Der Code in der ersten Schleife, der nur 100.000 Mal durchläuft dauert ca 1.734 Millisekunden, die zweite Schleife, die 5.000.000 Mal durchläuft ist in ca 90 Millisekunden fertig.
Aber warum ist es überhaupt notwendig? Meistens weil man Collection-Klassen wie ArrayList direkt verwenden will. Wenn man aber die .Net Klassenbibliotheken anschaut merkt man wenig Stellen wo man casten muss, obwohl bestimmt hinter vielen Collections ArrayLists, Hastables usw stecken. Warum ist das so? Weil .Net Typ-spezifische Collections hat. Ein ListView hat ein ListViewItemsCollection. Eine DataTable hat ein DataRowsCollection, usw. Nur in Fällen (wie ListBox.Items) wo beliebige Objekte aufgenommen werden muss man mit reinen Objekten umgehen. Es ist natürlich etwas mehr Arbeit solche Collections zu schreiben, aber das nenne ich eher einen sauberen Stil. Typsicherheit besteht wenn man nur die richtigen Objekte in einer Collection haben kann, nicht weil man ein Cast benutzen muss weil man eben nicht verhindert hat, dass fremdartige Objekte hineingelangen können.
Allerdings mit FW 2.0 gehört das alles hoffentlich bald der Vergangenheit an, weil man dann sehr einfach solche Collections benutzen kann. Mit
Dim col As New System.Collections.ObjectModel.Collection(Of c)
col.Add(New c)
Dim st2 As Long = Environment.TickCount
For i = 1 To 5000000
col(0).doit()
Next
Dim ct2 As Long = Environment.TickCount - st2 ist die Schleife in ca 110 Millisekunden durch (aber hier holen wir den Wert jedesmal aus der Collection).
________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist |