VB6 przekazuje wartość i postępuje zgodnie z linkiem
Staram się dowiedzieć, przekazywanie wartości i podążać za linkiem w VB6. W pełni rozumiem te pojęcia w językach programowania obiektowego, takich jak .NET i Java (rozumiem, że Java nie ma przejścia przez odniesienie). Spójrz na poniższy kod:
Private Sub Form_Load()Dim Test As Integer
Test = 1
TestFunction Test 'line 5
MsgBox (Test)End SubPrivate Sub TestFunction(ByVal i As Integer)
i = i + 1
End Sub
Kiedy umieściłem nawias wokół testu w linii 5, okno komunikatu wyświetlało 1, tak jak się spodziewałem. Spójrz teraz na poniższy kod:
Private Sub Form_Load()Dim Test As Integer
Test = 1
TestFunction Test 'line 5
MsgBox TestEnd SubPrivate Sub TestFunction(ByRef i As Integer)
i = i + 1
End Sub
Okno komunikatu wyświetla 2 zgodnie z oczekiwaniami. Jeśli jednak dodasz nawiasy do wiersza 5, okno komunikatu wyświetli 1, czego się nie spodziewałem. Wygląda na to, że funkcja wywołująca może przekazać wartość, nawet jeśli zmienną zdefiniowaną w wywołanej funkcji jest ByRef. I odwrotnie, jeśli wywoływana funkcja ma podpis ze zmienną zdefiniowaną jako ByVal, to zawsze będzie to ByVal (nawet jeśli nie ma nawiasów wokół zmiennej w funkcji wywołującej). Co się za tym kryje w VB6? Zdaję sobie sprawę, że jest to podstawowe pytanie w VB6, ale zdezorientowało mnie. Przeczytałem dokumentację MSDN i rozumiem, że to wszystko prawda, jednak nie wyjaśnia powodów.
Nie znaleziono powiązanych wyników
Zaproszony:
Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się
2 odpowiedzi
Anonimowy użytkownik
Potwierdzenie od:
wyjaśnione w instrukcji
http://msdn.microsoft.com/en-us/library/aa263527(VS.60).aspx
VB6. W poniższym kodzie VB6 traktuje argument jako
wyrażenie
(test), a nie odniesienie do zmiennej
Aby przekazać odwołanie do zmiennej, pomiń nawiasy lub użyj wycofanego
operator
http://msdn.microsoft.com/en-u ... .aspx (co wymaga nawiasów)
VB6 umożliwia przekazywanie wyrażeń do argumentów , nawet jeśli metoda je modyfikuje. Na przykład możesz pisać
Kompilator tworzy tymczasową kopię i przekazuje ją przez odniesienie. VB.Net
używa nawiasów w podobny sposób
http://msdn.microsoft.com/en-u ... .aspx
.
Możesz także zmusić kompilator do tworzenia kopii tymczasowych, jeśli TestFunction przyjmuje dwa takie argumenty:
Możesz też otrzymać tymczasowe kopie nawet za pomocą funkcji , jeśli podwoisz nawiasy, dodając dodatkową niepotrzebną parę:
Anonimowy użytkownik
Potwierdzenie od:
nawet jeśli to wyrażenie jest tylko jedną zmienną
... W twoim przypadku wynik tego wyrażenia jest następnie przekazywany jako argument.
W ten sposób faktycznie przekazujesz argument przez odniesienie. Ale argument, który przekazujesz, jest wynikiem wyrażenia, a nie oryginalną zmienną. Dlatego oryginalna zmienna nie jest aktualizowana.