Autore Topic: Istanza BYREF di un elemento di Collezione  (Letto 424 volte)

Offline Orionis

  • Gambero
  • **
  • Post: 58
    • Mostra profilo
    • BoxIdee
Istanza BYREF di un elemento di Collezione
« il: 04 Giugno 2014, 23:16:58 »
Nello sviluppo del  mio progetto ho scoperto una cosa perlomeno curiosa, a meno che io non abbia capito niente di Collezioni.
Esempio di codice:

Codice: [Seleziona]
'esiste altrove una Classe pubblica clsElementi 
Public cLista As Collection  'collezione di classi clsElementi
Private $cElemento as clsElementi 'dichiaro un elemento della Collection
....
$cElemento = New clsElementi
....
$cElemento = cLista["chiave"]

Fin qui tutto bene; $cElemento è una copia dell'elemento [chiave] nella collezione.
Però mi aspetterei che $cElemento sia, come detto, una copia instanziata per valore e non per referenza.
Questo è forse il mio errore 'ideologico'

In realtà, $cElemento è una copia per referenza, tant'è che se io modifico i contenuti di $cElemento questi sono immediatamente riflessi nella Collezione originaria.

Se questo è confermato, non sono certo che sia il comportamento corretto; è vero che semplifica la vita in quanto non è necessario fare l'assegnazione inversa (cLista["chiave"] = $cElemento) per registrare la modifica, però in questo modo si possono generare degli effetti collaterali subdoli.

Non so se sono stato chiaro nell'esposizione, ma se qualcuno ha delucidazioni da fornire è benaccetto.
Neanche gli Dei...possono nulla...contro la stupidità umana?

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.158
  • Tonno verde
    • Mostra profilo
Re: Istanza BYREF di un elemento di Collezione
« Risposta #1 il: 05 Giugno 2014, 10:46:04 »
Nello sviluppo del  mio progetto ho scoperto una cosa perlomeno curiosa, a meno che io non abbia capito niente di Collezioni.
Esempio di codice:

Codice: [Seleziona]
'esiste altrove una Classe pubblica clsElementi 
Public cLista As Collection  'collezione di classi clsElementi
Private $cElemento as clsElementi 'dichiaro un elemento della Collection
....
$cElemento = New clsElementi
....
$cElemento = cLista["chiave"]

Fin qui tutto bene; $cElemento è una copia dell'elemento [chiave] nella collezione.
Però mi aspetterei che $cElemento sia, come detto, una copia instanziata per valore e non per referenza.
Questo è forse il mio errore 'ideologico'

In realtà, $cElemento è una copia per referenza, tant'è che se io modifico i contenuti di $cElemento questi sono immediatamente riflessi nella Collezione originaria.

Se questo è confermato, non sono certo che sia il comportamento corretto; è vero che semplifica la vita in quanto non è necessario fare l'assegnazione inversa (cLista["chiave"] = $cElemento) per registrare la modifica, però in questo modo si possono generare degli effetti collaterali subdoli.

Non so se sono stato chiaro nell'esposizione, ma se qualcuno ha delucidazioni da fornire è benaccetto.



Ciao Orionis,
vedo che insisti con domandine facili facili  :o
Purtroppo io sulle strutture come già ho avuto modo di dire non ci capisco nulla.

Mi ricordo che avevo iniziato (solo iniziato però) a studiarle circa sette anni fa su vb.net e se mi ricordo qualcosa era appunto che mi avevano mandato in tilt i famosi quattro neuroni.

In net (non inorridire) era più o meno così (?!): classe = dato passato per riferimento; tipo = dato passato per valore; riferimento = eredità; valore = no eredità, però se usavi le strutture saltava tutto o quasi.

Ciò detto a questa domanda qui in questo forum ti può rispondere solo chi non risponde più.  :-\  :'(

Ti consiglio di girare la domanda a M. Benoit Minisini e cioè nella MLU.

Scusa tanto ma modestamente la mia ignoranza a volte tocca vette che voi umani...  ;D

PS: Non sarebbe male un tuo scritto sull'argomento una volta che ti sei schiarito gli ultimi dubbi.

...attendo fiducioso... sanmidi
« Ultima modifica: 05 Giugno 2014, 10:49:08 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.320
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Istanza BYREF di un elemento di Collezione
« Risposta #2 il: 05 Giugno 2014, 18:37:56 »
.... se qualcuno ha delucidazioni da fornire è benaccetto.

Nell'attesa di altre risposte qui, e con spirito ecumenico ed univarsale ho posto questa tua questione nel forum della Comunità ispanica dei programmatori Gambas.
Ho avuto una prima risposta che così traduco:

" Ritengo che sia coerente. In Gambas tutti gli oggetti vengono passati per "Riferimento" e presto ci si abitua a pensare così.
Se non ti piace, puoi utilizzare semplicemente il metodo .Copia() della Collezione, ossia:

Codice: gambas [Seleziona]
Public cLista As Collection  'collezione di classi clsElementi
Private $cElemento as clsElementi 'dichiaro un elemento della Collection
....
dim copyclista as Collection

copylista = cLista.Copy

$cElemento = New clsElementi
....
$cElemento = copylista["chiave"]
 
'...etc.


saluti "
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »