Mecanisme de transfer a argumentelor unei proceduri in VB.NET

O procedura […] este invocata, apelata, intr-un context dat. Procedura executa secventa de cod sursa in mod repetat, utilizand date diferite la fiecare invocare a sa. Datele utilizate sunt reprezentate de variabile […], constante si expresii transferate in procedura.
Parametrul reprezinta o valoare pe care procedura o asteapta la momentul invocarii. Definirea unei proceduri presupune si eventuala definire a listei de parametri.
Argumentul reprezinta valoarea furnizata parametrului procedurii la momentul invocarii acesteia. Argumentele reprezinta elemente cu valori diferite pentru invocari diferite ale procedurii.


Transferul argumentelor unei proceduri VB.NET se realizeaza prin doua mecanisme:

  • prin valoare;
  • prin referinta.

Prin mecanismul de transfer, se stabileste daca procedura modifica elementul reprezentat de argumentul transferat procedurii. Definirea listei de parametri stabileste mecanismul de transfer al argumentelor la momentul invocarii procedurii. Astfel, transferul prin valoare presupune declararea parametrului cu specificatia ByVal, iar transferul prin referinta consta in definirea parametrului cu ByRef.
La transferul unui argument intr-o procedura, trebuie sa aiba in vedere urmatoarele aspecte:

  • elementul reprezentat de argumentul transferat poate fi sau nu modificat;
  • argumentul insusi este sau nu modificat;
  • argumentul este transferat prin valoare sau referinta;
  • tipul de date al argumentului este un tip valoare sau tip referinta.

Criterii de selectie a mecanismului de transfer a argumentelor unei proceduri:

  • protectie: se considera expunerea la schimbare a variabilei de apel; transferul prin referinta ByRef consta in returnarea unei valori catre codul apelator prin argument; avantajul transferului ByVal consta in protectia variabilei transferate la modificarile din secventa executabila a procedurii;
  • performanta: transferul prin valoare presupune copierea argumentului; astfel, pentru valori mari ale datelor transferate este mai eficient mecanismul de transfer prin referinta.

Situatii de utilizare a argumentelor transferate prin valoare:

  • elementul de programare transferat catre procedura nu este modificabil;
  • elementul transferat este modificabil, dar procedura nu trebuie sa modifice valoarea acestuia; doar codul apelator poate schimba valoarea elementului transferat.

Situatii de utilizare a argumentelor transferate prin referinta:

  • procedura necesita modificarea elementului reprezentat de argument;
  • executia corecta a aplicatiei depinde de valorile modificate de procedurile invocate.

Cele doua proceduri incluse in aplicatia Console Application de mai jos exemplifica mecanismele de transfer prin valoare si referinta a argumentelor unei proceduri.

Module Module1
    Function SumaFct(ByVal x As Integer, ByVal y As Integer) As Long
        Dim z As Long
        z = x + y
        Return z
    End Function
    Sub SumaProc(ByVal x As Integer, ByVal y As Integer, ByRef z As Long)
        z = x + y
    End Sub

    Sub Main()
        Dim c As Long
        c = SumaFct(10, 11)
        MsgBox("c = " & c)
        MsgBox("Suma este: " & SumaFct(12, 13))
        SumaProc(14, 15, c)
        MsgBox("Noul c = " & c)
    End Sub
End Module

Cele doua mecanisme de transfer coexista in aceeasi procedura.
In cazul procedurii Function, se observa ca cei doi parametri sunt transferati prin valoare. Rezultatul prelucrarilor este transferat inapoi in codul apelator cu ajutorul specificatiei Return, intrucat variabila locala nu mai exista la revenirea in codul apelator. Valoarea acesteia este salvata intr-o noua locatie sau este utilizata direct in alte expresii de calcul.
In cazul procedurii Sub, lista parametrilor este suplimentat cu unul transferat prin referinta. La invocare, acesta este reprezentat de un argument de tip variabila care va surprinde modificarea efectuata in cadrul procedurii. Astfel, rezultatul prelucrarilor este referit direct prin denumirea variabilei c.