Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [VB.NET] byval VS byref

    ciao a tutti, perdonate se abuso di questo forum :P

    ma vorrei un chiarimento sul passaggio di parametri ad una funzione,

    ovviemente mi e' ben chiara la differenza tra ByRef e ByVal se stiamo parlando di passaggi che coinvolgono tipi Value ( int e compagnia bella...)

    ma se si tratta di puntatori a classi?

    es:
    codice:
    dim pippo as new Myclass()
    so ke se creo
    codice:
    dim pluto as myclass()
    pluto = pippo
    pluto e pippo puntano la stessa istanza dell'oggetto, e ke se voglio una copia devo usare una funzione apposta

    ma cosa devo aspettarmi nel passaggio tra funzioni?

  2. #2
    Quando passi un argomento di tipo Reference ad una funzione, se il passaggio avviene ByVal, se ne crea una copia (e quindi il parametro usato nel corpo è un'istanza diversa dal parametro attuale passato); se il passaggio avviene ByRef, passi alla funzione l'indirizzo dellì'istanza e quindi la puoi modificare permanentemente.
    codice:
    Module Module1
        Sub Fu(ByVal P As Person)
            P = New Person("Tizio", "Caio", Date.Parse("18/07/1980"))
        End Sub
    
        Sub Main()
            Dim P As New Person("Pinco", "Pallino", Date.Parse("17/6/1987"))
    
            Fu(P)
            Console.WriteLine(P.CompleteName)
    
            Console.ReadKey()
        End Sub
    End Module
    La scritta a schermo dirà "Pinco Pallino".
    Se cambi il passaggio a ByRef, la scrittà sarà "Tizio Caio".

    Ci sono dei casi particolari, però, in cui dei tipi Reference vengono passati per indirizzo anche se il parametro è esplicitamente dichiarato ByVal. E' il caso dei controlli windows form:
    codice:
    Module Module2
        Sub Fu(ByVal P As Windows.Forms.Button)
            P.Name = "Button2"
        End Sub
    
        Sub Main()
            Dim P As New Windows.Forms.Button
            P.Name = "Button1"
    
            Fu(P)
            Console.WriteLine(P.Name)
    
            Console.ReadKey()
        End Sub
    End Module
    In questo caso, la scrittà dirà "Button2", anche se P viene passata per valore.

  3. #3
    Originariamente inviato da Il Totem
    Quando passi un argomento di tipo Reference ad una funzione, se il passaggio avviene ByVal, se ne crea una copia (e quindi il parametro usato nel corpo è un'istanza diversa dal parametro attuale passato); se il passaggio avviene ByRef, passi alla funzione l'indirizzo dellì'istanza e quindi la puoi modificare permanentemente.
    ho fatto un po di prove... quale ke sia il passaggio nn viene assolutamente creata una nuova istanza dell'oggetto...

    l'esempio ke hai fatto restituisce "pinco pallino" xke nella funzione "Fu" crei te una nuova istanza: "p = new ...." spostando cosi' il riferimento del puntatore...

    se fai cosi':
    codice:
    Module Module1
    
    class Person
     private nome as string
    ....
    public sub cambia(byval nuovo_nome)
       nome = nuovo_nome
    end sub
    end class
    
        Sub Fu(ByVal P As Person)
            P.cambia("Tizio")
        End Sub
    
        Sub Main()
            Dim Q As New Person("Pinco")
    
            Fu(Q)
            Console.WriteLine(Q.CompleteName)
    
            Console.ReadKey()
        End Sub
    End Module
    indipendentemente dal fatto ke sia Sub Fu(ByVal P As Person) o Sub Fu(Byref P As Person)

    l'output sara' "tizio"

    xo credo di aver capito alla fine... grazie al tuo esempio
    mi spiego:
    Fu(ByVal P As Person): P e' un puntatore all'istanza ke gia avevamo....
    modifiche alle proprieta' di P causano modifiche alle proprieta' di Q
    se Associo P ad un altra istanza Q continua a puntare la vekkia...

    Fu(ByRef P As Person): P e' un puntatore al puntatore Q
    se associo P ad un altra istanza ache Q la puntera'

    e' giusto??

  4. #4
    Moderatore di CMS L'avatar di kalosjo
    Registrato dal
    Jul 2001
    residenza
    In culo alla luna
    Messaggi
    1,999
    Per tutte le variabili di tipi non primitivi il passaggio è sempre ByRef
    Scusate i puntini di sospensione...... La verità è che non ho argomenti....

  5. #5
    State facendo tutti un po' di confusione... date un'occhiata qui (dal mio post in poi ).
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Moderatore di CMS L'avatar di kalosjo
    Registrato dal
    Jul 2001
    residenza
    In culo alla luna
    Messaggi
    1,999
    Ottimo!!!

    Molto interessante! Grazie.
    Scusate i puntini di sospensione...... La verità è che non ho argomenti....

  7. #7
    Originariamente inviato da MItaly
    State facendo tutti un po' di confusione... date un'occhiata qui (dal mio post in poi ).
    in pratica quello ke avevo scritto.. ma esposto decisamente meglio di come avevo fatto io

    grazie mille per la conferma...

  8. #8
    Prego; ciao!
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.