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.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

To klasyczna pułapka w VB6. to

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
TestFunction (Test)

Aby przekazać odwołanie do zmiennej, pomiń nawiasy lub użyj wycofanego

operator
http://msdn.microsoft.com/en-u ... .aspx
Zadzwoń
(co wymaga nawiasów)
TestFunction Test
Call TestFunction(Test)

VB6 umożliwia przekazywanie wyrażeń do argumentów
ByRef
, nawet jeśli metoda je modyfikuje. Na przykład możesz pisać
TestFunction (Test + 2)

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:
TestFunction (one), (two)

Możesz też otrzymać tymczasowe kopie nawet za pomocą funkcji
Zadzwoń
, jeśli podwoisz nawiasy, dodając dodatkową niepotrzebną parę:
Call TestFunction((Test))
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Ujęcie dowolnego wyrażenia w nawiasach powoduje, że to wyrażenie jest oceniane jako pierwsze przed zrobieniem czegokolwiek innego,

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.

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się