poniedziałek, 26 sierpnia 2013

Nawiasy mają znaczenie!- procedura parametryzowana

Myślę, że wielu programistów nie zdaje sobie sprawy z faktu, że wywołując zewnętrzną procedurę parametryzowaną Sub ma znaczenie to, czy parametry zostaną podane w nawiasie czy też nie. Chodzi o różnicę, którą obrazują następujące składnie wywołania:

1ProceduraParametryzowana Argument
2ProceduraParametryzowana (Argument)

Zanim wyjaśnię  różnicę i przyczynę różnicy najlepiej będzie jeżeli spojrzymy na przykład:
01Sub Foo()
02 
03    Dim STR As String
04 
05    STR = "Hello"
06 
07    Boo (STR)  'wywołanie 1
08    Debug.Print STR '>> Hello
09 
10    Boo STR   'wywołanie 2
11    Debug.Print STR '>> Hello World
12 
13End Sub
1Sub Boo(ByRef PARAM As String)
2 
3    PARAM = PARAM + " World"
4 
5End Sub

Wywołanie procedury Foo sprawi, że najpierw otrzymamy w wyniku 'Hello', a następnie uzyskamy wartość zmiennej 'Hello World". Skąd ta różnica? Otóż ujęcie argumentów procedury w nawias (wywołanie 1 powyżej) zmienia typ parametru z ByRef na ByVal, to zaś sprawia, że zmienna przekazana do podprocedury `Boo` nie zmienia swojej wartości. Przekazanie argumentu bez nawiasu sprawia, że parametr jest typu ByRef a więc wszystkie operacje na nim wykonane w podprocedurze zostaną również przekazane do procedury nadrzędnej.

Podobną różnicę w zachowaniu i wyniku wywołania podprocedury znajdziemy korzystając z instrukcji Call. W tym przypadku dodatkowy nawias będzie zmieniał tryb przekazania parametru. Obrazują to następujące przykłady:

1Call Boo(STR)   >> przekazanie ByRef >>Wynik Hello World
2Call Boo((STR)) >> przekazanie ByVal >>Wynik Hello

Brak komentarzy:

Prześlij komentarz