Newsgroup: it.comp.lang.visual-basic
Titolo: ByRef non modificabile

So che e' quasi impossibile che si possa fare in qualche modo,
pero' ci provo.... non si sa mai... :-)
devo passare una grossa struttura di dati ad una routine
e devo essere sicuro che la routine non possa modificarla,
ne' ora (facilmente controllabile) ne' mai (impossibile sapere
chi andra' a modificarla in futuro).
Per risolvere il secondo problema mi basterebbe passare la variabile ByVal.
Purtroppo essendo la struttura molto grossa, il tempo impiegato e' notevole
(e la routine viene chiamata spesso), per cui devo passarla ByRef per
evitare
il tempo di copia della struttura.
Esiste un modo sicuro per rendere non modificabile la variabile ByRef ?
Escludendo una variabile globale (tempo zero ma resta modificabile)
ed escludendo di fare una copia della struttra prima di passarla (non
modificata ma tempi lunghi).
Credo sia impossibile da ottenere, ma se qualcuno ha una buona idea
per aggirare il problema.....
:-)
Grazie!

 il tempo di copia della struttura.
Piuttosto la devi passare ByRef perchè una struttura non può essere passata
ByVal.
Per simulare il ByVal puoi semplicemente dichiarare all'interno della sub
una variabile dello stesso tipo e assegnarla a quella in entrata e lavorare
su quella.
Altri modi non ci sono, però non credo sia così pesante la copia, a meno che
la struttura non sia di vari k.
Ciao

 SkunkGuru
Sknunk become a Guru Now!
Allora... No, non é possibile...
Però mi chidevo...
Se la struttura é così pesante da convenirne una copia perché non fai una
classe? Fai una classe, gli fai implementare un'interfaccia dove ci sono
solo le propertyGet... E il gioco é fatto! :)
   Ciao
       Allanon
--
- SPAMKILLER
 L'indirizzo delle risposte é 
itlangv...@michele.sytes.net
 LASCIATE il NOSPAM fa parte dell'indirizzo :-)
  Per superare le impostazioni di protezione antispam scrivete
  nel testo del messaggio la scritta "SPAMKILLER"
Scusate il disturbo, ma non posso più di pubblicità

 la struttura non sia di vari k.
Beh.... cambiando il ByVal in ByRef il tempo di esecuzione
della routine (chiamata circa 350 volte) e' passato da 3 minuti
a mezzo secondo....
:-O
Ciao!

 :-)
Credo che il consiglio di Allanon sia il migliore: elegante ed efficiente.
Altre alternative richiederebbero la modifica del codice finendo per
simulare l'utilizzo di una classe o di un oggetto.
Mi spiego meglio.
Se questi dati vengono utilizzati solo in lettura significa che ci saranno
solo ricerche di dati.
A questo punto potresti modificare le cose in questo modo:
1) Metti come variabile globale questa matrice.
So che hanno una brutta nomea i valori globali ma l'esperienza ci fa capire
anche le eccezioni a certe regole di buona programmazione.
Se esiste una sola matrice di quel tipo gestita dal programma non ha senso
continuare a passarla come argomento a decine di sub e function.
Se ne fa una sola globale e non ci si pensa piu'.
2) La routine incriminata a questo punto non dovra' accedere alla variabile
globale ma solo a funzioni inserite in essa che simulano dei metodi per
ottenere la ricerca di una valore.
Resta pero' il solito dubbio: se uno ha in mano i sorgenti puo' anche
modificarli come gli pare o accedere direttamente alla matrice globale.
Ma tu perche' pensi che queste persone possano usare "male" questo codice?
Per dolo o per incapacita'?
ciao
Paolo B.

 che tu non distribuisca *solo* il sorgente di quella routine.
La routine in questione deve fare un certo numero di controlli (solo
verifiche)
sulla matrice in questione.
Poiche' siamo in parecchie persone a lavorare sullo stesso progetto,
vorrei evitare che altri tra qualche tempo vadano a modificare questa
routine
aggiungendo (oltre ad altri controlli da fare sugli stessi dati), anche del
codice
che volutamente ("ah guarda, e' passata ByRef, allora la posso modificare
anche
da qui!", trovandomi cosi' con piu' routine che vanno a modificarla)
oppure per sbaglio mi vada a modificare la matrice.
Il classico caso in cui mettere un commento gigante con scritto
"non toccare questa variabile!!!" non servirebbe a niente...
:-)
Forse dovrei chiamare la variabile interna alla routine:
ByRef NonUsarmiInAssegnazione as ...
:-)
Probabilmente sembrera' una pignoleria stupida, pero'...
non tutti i colleghi sono uguali... ;-)
Ciao!

 non tutti i colleghi sono uguali... ;-)
No, affatto, č un ottima precauzione la tua. Il problema č che, in
effetti, non esiste una soluzione pulita. O meglio, c'č... ma č
prestazionalmente inacettabile.
Direi che l'unica cosa sarebbe cercare di rivedere se č possibile il
design di questa parte dell'applicazione, rendendo accettabile il
passaggio ByVal.
Ciao.
-- 
BSD is for UNIX lovers -- linux is for Windows haters.