Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
App. WinForms / WPF .NET
Static o shared?
lunedì 06 marzo 2006 - 17.39
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
Barabas
Profilo
| Junior Member
102
messaggi | Data Invio:
lun 6 mar 2006 - 17:39
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
1.509
messaggi | Data Invio:
lun 6 mar 2006 - 20:30
static di C# equivale a Shared di VB.NET non mi risulta che esista static su VB.NET
Barabas
Profilo
| Junior Member
102
messaggi | Data Invio:
lun 6 mar 2006 - 21:27
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
668
messaggi | Data Invio:
lun 6 mar 2006 - 22:12
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
1.509
messaggi | Data Invio:
lun 6 mar 2006 - 22:40
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
102
messaggi | Data Invio:
mar 7 mar 2006 - 11:05
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
668
messaggi | Data Invio:
mar 7 mar 2006 - 21:28
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
102
messaggi | Data Invio:
mer 8 mar 2006 - 19:51
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
668
messaggi | Data Invio:
mer 8 mar 2006 - 20:06
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
102
messaggi | Data Invio:
ven 10 mar 2006 - 10:22
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
Torna su
Stanze Forum
Elenco Threads
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 !