12. januar 2002 - 20:03Der er
10 kommentarer og 2 løsninger
Syntaks
Sider og læser bogen \"desktop application with microsift Visual absci 6.0\" og har stødt ind i nogen uklarheder.
1. Så videt jeg forstår er det her;
dim temp as class1 set temp = new class1
langsommer end det her;
dim temp as new class1
Men alle steder i bogen bruger de den første kodestump til at oprette et object. Har jeg misforstået det, og er det første den hurtigste måde
2. Jeg har lavet et windows API kald, men undrer mig over at \"MsgBox strWinDir & \",\" & Len(strWinDir)\" ikke giver mig windows directory samt en komma samt længnden på strengen. Det giver mig kun windows directory. \"MsgBox Len(strWinDir)\" giver mig længden på strengen som er 255 tegn. Desuden undrer det mig jeg ikke kan se alle a\'er som jeg har fyldt ind i strengen fra starten, når den nu siger at strengen er 255 tegn lang. kode:
Private Declare Function GetWindowsDirectory Lib \"kernel32\" Alias \"GetWindowsDirectoryA\" (ByVal lpBuffer As String, ByVal nSize As Long) As Long
Private Sub Command1_Click()
Dim strWinDir As String Dim lngLen As Long strWinDir = String(255, 65) MsgBox strWinDir
1>> Ja det er dig der har misforstået det. Det er første kode stump der er den hurtigste....der laver man en early binding, som er klart hurtigere end late binding som bruges i eksempel nr. 2
Hvad du siger med late binding er også rigtigt, men det jeg siger omkring late binding er nu også rigtigt....mener jeg :-))
Hvorom alting er, så sker der det at objektet først bliver lavet når det bliver refereret til, hvorimod den anden kode der bliver objektet oprettet samme sted som det står.
Min kode 2 gær det du siger, men det var bare for at kunne finde win biblioteket frem. Det er dog ikke den rigtige måde at gøre det. Brug istedet for lnglen variablen der indeholder streng længden.
dim temp as class1 set temp = new class1 langsommer end det her; dim temp as new class1
For at du kan anvende disse linier skal du først oprette en Class1. Det gøres ved at du tilføjer en ClassModule til dit project, og her skriver du så den kode der skal til for at oprette en classe.
\"Note Using variables declared using the New keyword can slow your application. Every time Visual Basic encounters a variable declared using New, it must test whether or not an object reference has already been assigned to the variable.\"
Fint, så har du jo selv opklaret spørgsmålet. Men det er jo ikke sikkert at fordi din \"benchmark\" test giver det samme resultat hvergang. Når selv MS gør opmærksom på at der er lidt problemer med den nederste syntaks, så bør man nok tage det til efterretning.
dingdong bliver først instansieret første gang jeg tilgår objektet, f.eks.:
dingdong.Ring \'Her instansieres objektet
Bag ved scenen foregår følgende:
If dingdong = Nothing Then Set dingdong = New Bell End If dingdong.Ring
Ved anden fremgangsmåde:
Dim dingdong As Bell Set dingdong = New Bell
Instansieres objektet ved \"Set dingdong = New Bell\"
Der kan nu arbejdes med objektet uden \"If sætningen\".
Konklusion:
Dim dingdong As New Bell
For x=1 To 10000 dingdong.Ring Next x
ER langsommere end
Dim dingdong as Bell Set dingdong = New Bell
For x=1 To 10000 dingdong.Ring Next x
idet der ved sidste eksempel ikke skal testes om objektet er instansieret, hver gang det tilgås.
Iøvrigt frarådes:
dim dingdong As New Bell
fordi at instansieringen ikke bliver foretaget eksplicit, hvilket betyder at du dybest set ikke selv kontrollere hvornår og hvordan objektet bliver instansieret.
Eksempel på fejlmulighed:
Dim dingdong As New Bell
dingdong.Volume=100
Set dingdong=Nothing
dingdong.Ring
Hvis man ikke lige er opmærksom på at objektet er blevet termineret kan man godt undre sig over at dingdong.Ring ikke foregår med en Volume på 100...
Dette er godtnok et banalt eksempel, tilgengæld ved jeg at autoinstansiering kan give anledning til nogle ret uforudsigelige eksekveringer.
Late Binding betyder at man ikke har en objekt reference i sit projekt, men at man bruger CreateObject(CLSID) til instansiering. -Dette medfører et opslag i registry for at finde den seneste version der har det pågældende Class ID. Dette opslag spares ved earlybinding og er derfor væsentlig hurtigere.
/Jennemaan
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.