Static o shared?

lunedì 06 marzo 2006 - 17.39

Barabas Profilo | Junior Member

nella mia windows application scritta in vb.net c'è la Form1 che contiene il parametro X.
tramite un controllo della Form1 si crea la Form2 che deve comportarsi diversamente a seconda del valore di X.

che metodo uso per far sì che Form2 conosca X?
potrei passarlo come parametro quando creo Form2 ma in pratica è piuttosto complicato per come sono realmente fatte le 2 form, il controllo ed il parametro stesso.

vorrei provare a mettere X in area globale in modo che sia visibile a tutti dichiarandolo static, ma non sono sicuro se vada bene così, o devo dichiararlo Shared? Quali sono le differenze i pro e i contro?

grazie
Barabas

Cteniza Profilo | Guru

static di C# equivale a Shared di VB.NET non mi risulta che esista static su VB.NET

Barabas Profilo | Junior Member

Static esiste, o per lo meno non mi dà errore se lo metto davanti ad un oggetto dichiarato in una sub, cioè non un dato membro...
Barabas

alextyx Profilo | Expert

Static, in vb.net, se ben ricordo, sta a significare una variabile che non viene reinizializzata e quindi conserva il proprio valore tra una chiamata e l'altra di una procedura. Per rendere qualcosa visibile globalmente, il qualificatore giusto è 'public'. Se vuoi vedere da tutta la tua applicazione, per esempio, la variabile stringa 'pippo', devi scrivere, in un modulo:

Public pippo as string

Cteniza Profilo | Guru

Hai ragione, facevo il riferimento con C# e mi dimenticavo di questa cosa che consente di mantenere il valore di una variabile interna di una sub o funzione tra una chiamata e l'altra.
Credo sia una vera anomalia di vb.net, non avendola mai usata reputavo che non esistesse.
Infatti per una classe normale che deve conservare il valore di una variabile interna io vedo ovunque:
Private Shared mMembro As ....
e
Public Shared Property Membro As ...
Get
Set
End Property
Continuerò comunque a non usarla

Barabas Profilo | Junior Member

vi ringrazio per le risposte, ma ancora nn ho risolto.

in passato ho usato dati membro dichiarati come segue:

Class 2

Public Shared X as tipo

poi in un'altra classe

Class 1

dim obj as new Class 2

obj.x=valore...

cioè class1 crea una istanza di class 2 che espone l'attributo pubblico e condiviso X e lo usa.

io vorrei fare una cosa diversa:
class 1 espone l'attributo pubblico e condiviso o static X .
class1 crea una istanza di class 2
class 2 riesce a vedere X e lo usa

per questo avevo pensato a static...

che ne dite?
Barabas

alextyx Profilo | Expert

Caro Cteniza, proprio un attimo dopo aver postato il mio intervento, parlando con un amico, ho sparato una bischerata piuttosto grossa. Se penso che io lavoro solo in Assembly e Vb.Net e che tu lavori in (x quanto ne so) C#, Pascal e VB.Net, direi che lo scordarsi qualche dettaglio è, come minimo, più che comprensibile!

Per tornare al quesito di Barabas, vediamo cosa scrive:

"vi ringrazio per le risposte, ma ancora nn ho risolto.

in passato ho usato dati membro dichiarati come segue:

Class 2

Public Shared X as tipo

poi in un'altra classe

Class 1

dim obj as new Class 2

obj.x=valore...

cioè class1 crea una istanza di class 2 che espone l'attributo pubblico e condiviso X e lo usa.

io vorrei fare una cosa diversa:
class 1 espone l'attributo pubblico e condiviso o static X .
class1 crea una istanza di class 2
class 2 riesce a vedere X e lo usa

per questo avevo pensato a static...

che ne dite?"

Allora, intanto vorrei capire il perchè di shared . Un membro shared è accessibile senza dover creare un'istanza della classe che lo espone. Una variabile shared, inoltre, è trasversale a tutte le eventuali istanze della classe che la espone. Static, invece, diversamente dal C (vedi post precedenti), in VB.Net non serve ad altro che a mantenere un valore tra successive chiamate ad una procedura). Non capisco l'utilità di qualificare come shared una variabile in questo contesto. Invece, la dichiarazione 'Public' permette a chiunque abbia un riferimento alla classe, di ottenere l'accesso alla variabile. Se essa (la variabile) fosse dichiarata pubblica, in un modulo, come suggerito da me, il problema sarebbe risolto. Se però la si vuole 'legare' ad una istanza della classe (quindi inutile dichiararla shared), allora bisogna procurarsi un riferimento all'istanza in questione. Il mio suggerimento è di passare un riferimanto a Class1, in Class2. Normalmente lo si fa definendo una variabile privata di tipo class1 (per esempio di tipo 'Form') in class2. Poi, in un overload del metodo costruttore (new), al quale viene passato un parametro di tipo Class1, si assegna il valore del parametro alla variabile privata di tipo class1. Per esemplificare (occhio che sto scrivendo il codice a memoria e quindi ci saranno inevitabili errori! ):


in class2

Dim MiaF as Form

Public sub new(byref F as Form)
Me.MiaF=F
............
end sub
MiaF.X=......... 'Qui la X dovrebbe essere accessibile


In class1

Dim C2 as new Class2(Me)
..........


Spero di non aver messo troppe castronerie o non aver dimenticato troppe cose. Sono piuttosto stanchino, stasera. Ho passato più di 2 ore sulla poltrona del dentista e sono ancora sconvolto!

Barabas Profilo | Junior Member

ma è prorio il riferimento alla classe che mi manca, cioè che non posso usare...
perciò va bene static proprio perchè trasversale a tutte le istanze della classe ed utilizzabile anche senza istanziare la classe.

invece static non mi serve


Barabas

alextyx Profilo | Expert

Beh, se è questo che ti serve, allora vada per lo shared
Non mi è chiaro perche, pur avendo istanziato una form da dentro un'altra, tu non possa riferire la seconda nella prima, ma prendo per buono quanto mi dici. L'importante è aver capito cosa serve in quella ipotesi e mi sembra che alla fine una decisione sia stata presa. Ciao e buon lavoro.

Barabas Profilo | Junior Member

il discorso che ho fatto era molto semplificato, in pratica potevo andare incontro a problemi di allocazione ricorsiva e quindi stack overflow...
mi serviva appunto referenziare un dato memro di una classe senza istanziarla, quindi shared...
Barabas
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5